poj1321 棋盘问题(DFS)

题目链接

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 }
原文地址:https://www.cnblogs.com/sench/p/7828430.html