POJ 1321 棋盤問題 經典DFS

2022-06-26 04:33:11 字數 1665 閱讀 4795

time limit: 1000ms memory limit: 10000k

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

可以說是非常經典的一道dfs題目了,不說有多難,但是可以很好地體現出dfs的思想。

對於乙個n*n的棋盤,我們考慮按行進行dfs,一行一行往下推進就類似於dfs一層一層往下搜尋。

對於函式dfs(int row,int num),row表示當前進行到哪一行,num代表到目前為止,棋盤上已經放了多少棋子了。

那麼,在dfs()這個函式中,顯然要對row這行上的每一格進行一次遍歷(一次for迴圈);

遍歷的過程中,遇到能放棋子的格仔(兩個要求:①這一格確實是屬於棋盤的 map[i][j]='#' ;  ②這一列上,上面那幾行沒有放過棋子 vis[col]==0 ),那就不管了,先放上去再說;

那麼我們放了一顆棋子之後,這行就不能再放了,那就往下走一行dfs(row+1,num+1);

那麼我們dfs(row+1,num+1)這個做完了之後呢?

顯然,我們又不是一定要往這個格仔上放旗子,棋盤這麼大我想去看看,所以我們要把之前放下的那顆棋子拿起來,繼續在row這行上繼續遍歷,尋找下乙個能放棋子的格仔;

最後我如果把這一行全部遍歷完了呢?我們是不是非得往這行上放棋子?

當然不是啦

如果棋子少,這行不放也是可以的呀,所以在一次for迴圈結束之後,我們也要往下一行走,即dfs(row+1,num)。

這就是大體上的dfs思路啦

,更多細節請詳見**:

1 #include2 #include3

char map[11][11];4

intn,k,ans;

5bool colvis[11];6

void dfs(int row,int

num)713

if(row>n) return;14

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

1522

}23 dfs(row+1

,num);24}

25int

main()

2636 }

潑婦愛科特!!!

POJ 1321 棋盤問題 經典DFS

在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。經典dfs 用乙個all記錄擺放種類,乙個now記錄目前為止放了幾個棋子,當now k時 all...

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