棋盘问题 POJ-1321 DFS
题目链接:棋盘问题
题目大意
在n*n的不规则的棋盘上摆放k枚棋子,要求每行和每列上只能有一枚棋子。
思路
和八皇后问题类似,只不过这个问题不一定是一行摆放一个。因此dfs的时候要多用一个参数来表示当前搜索的行数。
题解
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int n,k,ans; 6 char a[10][10]; 7 bool vis[10]; 8 9 void dfs(int num, int row) 10 { 11 if(num >= k) 12 { 13 ans++; //放完所有的棋子,答案数+1 14 return; 15 } 16 for(int i = row; i < n; i++) 17 { 18 for(int j = 0; j < n; j++) 19 { 20 if(!vis[j] && a[i][j] == '#') 21 { 22 vis[j] = true; //在[i][j]位置放一枚棋子 23 dfs(num+1, i+1); //搜索下一行能放的位置 24 vis[j] = false; //回溯到上一行的状态 25 } 26 } 27 } 28 } 29 30 int main(){ 31 #ifdef debug 32 freopen("test.txt","r",stdin); 33 #endif 34 while(cin >> n >> k) 35 { 36 if(n == -1 && k == -1) return 0; 37 ans = 0; 38 memset(vis, false, sizeof(vis)); 39 memset(a, 0, sizeof(a)); 40 for(int i = 0; i < n; i++) 41 { 42 for(int j = 0; j < n; j++) 43 { 44 cin >> a[i][j]; 45 } 46 } 47 dfs(0,0); 48 cout << ans << endl; 49 } 50 return 0; 51 }