(DFS)棋盤問題(poj1321)

2021-08-22 08:41:17 字數 1380 閱讀 3604

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

k<=n,我覺得這個和八皇后不同一點就是八皇后列從第一行一直找到最後第n行,但是這個可以在某一行不放棋子。於是我們dfs裡面就要考慮寫乙個二重迴圈,行和列都要考慮到,我們假設固定行,就是說,每次行從第x行開始,就算回溯了,還可以從第x+i行繼續呼叫,從而考慮到所有情況

由於是一行一行的呼叫,因此已經放置的棋子必然不再同一行,那現在就需要考慮怎麼整乙個條件能夠去判斷是不是在同一列,額當然了,用乙個標記陣列visit,如果如果標誌陣列visit[j]=0說明第j列沒有用過,那我們就可以大膽的放到第j列了

dfs(x,y)的意思是在第x行準備放第y+1個棋子,額就是現在已經放了y個棋子了,我們固定了這第x行,從第一列開始找,我們放棋子的條件是!visit[j]&&mp[i][j]==』#』,找到一滿足條件的列,我們就把棋子放這一列上,放完這一行的棋子,我們就繼續遞迴找下一行,遞迴完了還要清除標誌陣列,因為除了在第x行的第j列放棋子,仍有可能在其他列仍然能放棋子。而dfs的返回條件就是現在放的棋子個數y已經等於k了,那就return了

**參考:

#include

#include

#include

#include

using

namespace

std;

int visit[20];

char mp[20][20];

int ans;

int k;

int n;

int dfs(int x,int y)

for(int i=x;ifor(int j=0;jif(!visit[j]&&mp[i][j]=='#')}}

return0;}

int main()

POJ 1321 棋盤問題(棋盤DFS)

棋盤問題 思路 分層查詢,逐行深搜。注意k n時的處理。1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 define ll long long 11 define...

POJ 1321 棋盤問題 DFS

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

poj 1321 棋盤問題(DFS)

大概題意就是給你乙個棋盤,讓你放棋子,求在棋盤n n上的 放上k個棋子的所有情況的數目。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列。深搜可以搜尋出所有答案。直接看 include includebool chess 9 9 bool vis col 9 int n,k,ans void...