POJ 1321 棋盘问题
分析:
DFS,不能放在同一行或同一列,有点类似n皇后问题
一列一列的往下搜索,这一列有棋子,标记这一列。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 6 int n, k, ans = 0; 7 int vis[10]; //line 一行一行的扫 8 char map[10][10]; 9 void DFS(int row, int m) 10 { 11 if(m == k) {ans++; return;} 12 if(row > n) return; 13 for(int i = 1; i <= n; i++){ 14 if(vis[i] == 0 && map[row][i] == '#'){ 15 vis[i] = 1; 16 DFS(row+1,m+1); //下一个棋子在下一行 17 vis[i] = 0; 18 } 19 } 20 DFS(row+1,m); //扫描下一步 21 } 22 int main() 23 { 24 while(cin >> n >> k && n != -1 && k != -1){ 25 ans = 0; 26 memset(vis,0,sizeof(vis)); 27 for(int i = 1; i <= n; i++) 28 for(int j = 1; j <= n; j++) 29 cin >> map[i][j]; 30 DFS(1,0); 31 cout << ans << endl; 32 } 33 return 0; 34 }