A 棋盤問題 POJ 1321

2021-10-02 17:55:36 字數 1328 閱讀 1851

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

題意:n*n的區域,#區域可以用來擺棋子,問有多少種擺棋子的方案數?

思路:明顯的dfs,想到了八皇后問題,不過這個沒有八皇后要求的對角線乙個棋子這麼嚴格,並且八皇后要求一行接著一行擺的,這個棋盤問題只要按要求擺好k顆棋子就行了,所以有的行可能沒有棋子。然後我套八皇后的**w了(;´༎ຶд༎ຶ`)

然後呢?我又想啊,要不套地圖的**吧,每個點分四個方向都走一遍,然後發現走不下去要是乙個#周圍全圍著『。』就直接return了,還有一些錯誤:不能四個方向啊,下面一行又向上走的話,棋子的排列情況會重複計數的。

最後只能在dfs裡套兩個for迴圈,行數的初值設為m,表示前面的m行棋子的擺放情況已經確定了,如果又從0開始了就不能保證一行只有乙個棋子了(之前擺過了,又擺一遍)。符合條件,繼續從第m+1行開始擺(注意只是從m+1開始,並不表示這一行一定要擺上棋子所以i才要從m到n),直到k顆棋子擺完,解的個數加一;

#include#includeusing namespace std;

int n, k, ans = 0;

char a[10][10];

int book[10];//book[i]為0表示這一列沒有棋子

void dfs(int m, int step)//現在走到第m行,已經擺好了step顆棋子

//當擺好了k顆棋子時,遞迴邊界

for (int i = m; i < n; ++i)

} }}int main()

//system("pause");

return 0;

}

POJ 1321 棋盤問題

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

poj 1321 棋盤問題

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

POJ 1321 棋盤問題

找到第乙個有 的行開始回溯就可以了 include include using namespace std const int maxn 9 char board maxn maxn bool c maxn int ans,n,k void backtracking int curi,int cnt...