1. 程式人生 > >poj1321 棋盤問題(DFS)

poj1321 棋盤問題(DFS)

problem ble pen 兩個 oid boa 可能 ref 題意

題目鏈接

http://poj.org/problem?id=1321

題意

給定一塊棋盤(棋盤可能是不規則的),有k個相同棋子,將k個棋子擺放在棋盤上,使得任意兩個棋子不同行,不同列,求有多少種不同的擺法。

思路

此題和八皇後問題很像,需要註意擺放完畢後要恢復現場,便於下一次擺放。

代碼

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int N = 10;
 7 char board[N][N];
8 int visit[N]; //visit[j]=1表示第j列有棋子, 0表示無棋子 9 int n, k; 10 int cnt; //擺放方案數 11 12 void dfs(int k, int r) 13 { 14 if(k==0) 15 { 16 cnt++; 17 return; 18 } 19 20 for(int i=r; i<N; i++) 21 { 22 for(int j=0; j<N; j++) 23 { 24 if
(board[i][j]==#&& !visit[j]) 25 { 26 visit[j] = 1; 27 dfs(k-1, i+1); //從下一行開始搜索 28 visit[j] = 0; //恢復現場,便於回溯 29 } 30 } 31 } 32 } 33 34 int main() 35 { 36 //freopen("poj1321.txt", "r", stdin); 37
while(cin>>n>>k) 38 { 39 if(n==-1) 40 return 0; 41 for(int i=0; i<n; i++) 42 cin>>board[i]; 43 44 memset(visit, 0, sizeof(visit)); 45 cnt = 0; 46 dfs(k, 0); 47 cout<<cnt<<endl; 48 } 49 return 0; 50 }

poj1321 棋盤問題(DFS)