poj 1321 棋盤問題

2021-06-25 07:57:06 字數 1581 閱讀 1038

棋盤問題

time limit:1000ms

memory limit:10000k

total submissions:22863

accepted:11344

description

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

source

蔡錯@pku

題解:

這道題 三個月前做過一次,那個時候剛入門,看著別人的題解,無法理解別人寫的**,不懂什麼是回溯  =.=,不斷的畫著想著,估計那時候沒徹底弄懂。

今天做搜尋專題時,想了想如何構造深搜函式~~~1a;

思路:關鍵是要弄清楚如何搜尋,因為是乙個棋盤,棋盤有行也有列,由於給出了限制條件:要求擺放棋子時,任意的棋子不能放在同一行同一列。如果是這樣的話,我們用for迴圈對行搜尋(因為某行乙個點放了棋子,那麼這列都不能放棋子了)

至於題目要求有多少方案~~~那就回溯求方案數;

#include #include #include #include #include #include using namespace std;

int n,k;

char map[10][10];

int vis[10];//判斷某列能否放棋子

int cnt;

//對棋盤的行深搜,不管列~~~x表示當前所在的行,cur表示當前棋盤上有的棋子數

void dfs(int x,int cur)

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

}dfs(x+1,cur);

}int main()

{ while(cin>>n>>k)

{if(n==-1&&k==-1)break;

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

for(int j=1;j<=n;j++)

cin>>map[i][j];

memset(vis,0,sizeof(vis));

cnt=0;

dfs(1,0);

cout<

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...