码迷,mamicode.com
首页 > 其他好文 > 详细

专题一 简单搜索 Problem A

时间:2015-07-12 23:02:26      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

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

题目大意和N皇后类似,只不过可能出现K<N的情况。

按照行的顺序进行深搜,如果当前行可以放置棋子,则换下一行进行搜索。

用一个二维数组描述棋盘,一个一维数组标记此列是否走过。

技术分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 
 4 const int MAXN=8;
 5 char m[MAXN][MAXN]; //记录棋盘
 6 int vis[MAXN];  //标记每一列是否访问过
 7 int n,k,res;
 8 
 9 void dfs(int cur,int num)//cur为当前行,num为当前放置好的棋子数目
10 {
11     if(num==k) //如果所有棋子都已放好,则结果加1,返回
12     {
13         res++;
14         return;
15     }
16 
17     if(cur>=n) return;//防止搜索越界
18 
19     for(int i=cur;i<n;i++)
20     {
21         for(int j=0;j<n;j++)
22         {
23             if(m[i][j]==# && vis[j]==0)
24             {
25                 vis[j]=1;//放好当前行时,将当前列标记为走过
26                 dfs(i+1,num+1);//如果当前行放好了,则换下一行,num+1
27                 vis[j]=0;//递归结束后复原
28             }
29         }
30     }
31 }
32 
33 int main()
34 {
35     while(scanf("%d %d",&n,&k)!=EOF)
36     {
37         getchar();
38         if(n==-1 && k==-1) break;
39 
40         for(int i=0;i<n;i++)
41         {
42             for(int j=0;j<n;j++)
43             {
44                 scanf("%c",&m[i][j]);
45             }
46             getchar();
47         }
48         for(int i=0;i<n;i++) //初始状态下每一列标记都置为0
49         {
50             vis[i]=0;
51         }
52         res=0;
53         dfs(0,0); //第一个0为从二维数组的第0行开始搜索,第二个0为当前放置了0个棋子
54         printf("%d\n",res);
55     }
56     return 0;
57 }
View Code

 

专题一 简单搜索 Problem A

标签:

原文地址:http://www.cnblogs.com/Page3/p/4641705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!