做練習 棋盤問題(深度優先搜尋)

2021-10-07 10:28:28 字數 1181 閱讀 9872

總時間限制: 1000ms 記憶體限制: 65536kb

在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。

輸入含有多組測試資料。

每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n

當為-1 -1時表示輸入結束。

隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。

對於每一組資料,給出一行輸出,輸出擺放的方案數目c (資料保證c<2^31)。

2 1#.

.#4 4

…#…#.

.#…#…

-1 -121

棋盤計數一看就是一道搜尋題,選擇最容易實現的深度優先搜尋,使用遞迴函式即可實現。

由於行和列都不能重複,所以,搜尋過程中,總是先順著行數往下搜,在每一行中枚舉行中可能的的擺法。一行中可能的擺法有:

如果剩下的行數不少於剩餘的棋子數,可以選擇不擺。

擺在某個不和搜尋路徑產生列衝突的位置。

#include

int n;

bool valid[8]

[8];

bool colomnplaced[8]

;int cnt =0;

void

dfs(

int row,

int k)

else

if(row >= n)

return

;// 這一行放置

for(

int i =

0; i < n; i++)if

(valid[row]

[i]&&

!colomnplaced[i]

)// 剩下的行夠放剩下的棋子時,這一行可以不放置

if(n - row - k >0)

dfs(row +

1, k);}

intmain()

dfs(

0, k)

; std::cout << cnt << std::endl;

}return0;

}

POJ 1321 棋盤問題 深度優先搜尋

棋盤問題 time limit 1000ms memory limit 10000k total submissions 60983 accepted 29214 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同...

深度優先搜尋 poj 1321棋盤問題

題目描述 棋盤問題 time limit 1000ms memory limit 10000k total submissions 63237 accepted 30234 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在...

棋盤問題 簡單搜尋練習

poj1321 dfs 棋盤問題 解題報告 1.題意很簡單,乙個棋盤問題,可以用搜尋方式解決。那麼好,它的搜尋框架很明晰了,從乙個狀態到下乙個搜尋狀態,直到數目達到k,計數加一,或者此搜尋狀態無解,回溯。顯然,搜尋退出條件是數目達到k或者此搜尋狀態無解。2.狀態如何表示?vis i j 標記是否有落...