poj1321 棋盤問題(DFS)
阿新 • • 發佈:2017-11-13
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); 37while(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)