POJ 1321 棋盘问题 DFS搜索

简单搜索 练习一下回溯

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <sstream>
 5 #include <string>
 6 #include <algorithm>
 7 #include <list>
 8 #include <map>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <cstdlib>
14 using namespace std;
15 int n,k;
16 int ans;
17 char s[10][10];
18 int usex[10],usey[10];
19 bool ok(int x,int y){
20     if(x<0||x>=n||y<0||y>=n)
21         return 0;
22     if(s[x][y]=='.'){
23         return 0;
24     }
25     if(usex[x]==1||usey[y]==1)
26         return 0;
27     return 1;
28 }
29 void dfs(int x,int y){
30     if(y==k){
31         ans++;
32         return ;
33     }
34     if(x>n){
35         return ;
36     }
37     for(int i=0;i<n;i++){
38         if(ok(x,i)){
39             usey[i]=1;
40             usex[x]=1;
41             dfs(x+1,y+1);
42             usey[i]=0;
43             usex[x]=0;
44         }
45     }
46     dfs(x+1,y);
47 }
48 int main(){
49     while(~scanf("%d%d",&n,&k),n!=-1||k!=-1){
50         ans=0;
51         memset(usey,0,sizeof(usey));
52         memset(usex,0,sizeof(usex));
53         for(int i=0;i<n;i++){
54             scanf("%s",s[i]);
55         }
56         dfs(0,0);
57         printf("%d\n",ans);
58     }
59     return 0;
60 }
View Code

 

posted @ 2016-04-06 21:48  yyblues  阅读(166)  评论(0编辑  收藏  举报