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 }

 

posted @ 2018-08-21 16:56  愉也  阅读(104)  评论(0编辑  收藏  举报