poj 1321 棋盘问题 简单DFS

题目链接:http://poj.org/problem?id=1321

很久没有敲搜索了啊,今天敲了个水题练练手,哈哈。。。。

题目大意: 就是求在n*n的方格上放置k个棋子的方案数

代码:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 int n,k;
 7 char map[10][10];
 8 int visit[10];
 9 int sum;
10 int ans;
11 bool Jude(int k,int num)
12 {
13    int i;
14    if(k==-1) return 1;
15    if(map[num][k]=='.') return 0; 
16    for(i=0;i<num;i++)
17        if(k==visit[i]) break;
18    if(i== num ) { visit[num]=k; sum++; return 1;}
19    else return 0;
20 }
21 void dfs(int row)
22 {
23    if(sum==k) {ans++;return ;}
24    if(row ==n && sum<k) return ;
25    int i=-1;
26    while(i<n)
27    {
28      if(Jude(i,row))
29      {
30           dfs(row+1);
31           if(i>=0) { visit[row]=-1;sum--;}
32      } 
33      i++;
34    }
35 }
36 int main()
37 {
38    while(scanf("%d%d",&n,&k)!=EOF)
39    {
40        if(n==-1 && k==-1) break;
41        for(int i=0;i<n;i++) scanf("%s",map[i]);
42 
43        memset(visit,-1,sizeof(visit));
44        sum=0;
45        ans=0;
46        int i=-1;
47        while(i<n)
48        {
49           if(Jude(i,0)) 
50              {
51                 dfs(1);
52                 if(i>=0) { visit[0]=-1;sum--;}
53              }
54           i++;
55        }
56        cout<<ans<<endl;
57           
58    }
59    return 0;
60 }
原文地址:https://www.cnblogs.com/xiaozhuyang/p/poj1321.html