列舉深度優先 棋盤問題POJ 1321

2021-09-12 21:03:24 字數 1369 閱讀 7354

poj - 1321 

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

input

輸入含有多組測試資料。 

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

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

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

output

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

sample input

2 1

#..#

4 4...#

..#.

.#..

#...

-1 -1

sample output

2

1

/*

類似於八皇后問題,由於每個棋子所在的行和列都不能有棋子,所以每一列最多只能有乙個棋子,

所以採用乙個book陣列記錄每一列是否已經放過棋子,同時要用乙個二維陣列記錄棋盤,判斷

每行可放棋子的位置,如此一行行往下遍歷/列舉,篩選出符合要求的情況。

對於每一組資料,採用遞迴的方法,一次下移一行,終止條件為棋子放完、遍歷到最後一行,由於

每一行都可能有多個#,所以採用深度優先遍歷的方法,先把前面的情況往下走完,然後還原到原來

的地方的下一種可能往下走,以此類推。

*/#include#include#includeusing namespace std;

char a[10][10]; //記錄棋盤位置

int book[10]; //記錄一列是否已經放過棋子

int n, k;

int total, m; //total 是放棋子的方案數 ,m是已放入棋盤的棋子數目

void dfs(int cur)//針對每一行的列舉判斷

if (cur >= n) //邊界

return;

for (int j = 0; jif (book[j] == 0 && a[cur][j] == '#') //判斷條件,該列可以放棋子

dfs(cur + 1); //到下一行

}int main()

return 0;

}

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 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在...

poj 棋盤問題(經典DFS)(列舉)

棋盤問題 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數...