POJ 1321 棋盘问题

//1321、我分分钟都可以A掉你你都不知道系咩事、

A掉的那一刻,我盯着屏幕看了好久,这真是一道让我痛苦万分的题目,

递归啊递归。。。是看了discuss里有个人贴的错误代码才获得灵感。。。

 

思考了那么久,是那么的值得,差点放弃了。。。

 

另外这道题要深刻总结,网上看了两种更简洁的方法,明天具体分析。

真是一道关于深搜、递归的好题。

 

View Code
 1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5
6 char map[9][9];
7 int size,num;
8 int sum;
9 bool vrow[9],vcolumn[9];
10
11 #define ONLINE
12
13 void online()
14 {
15 #ifdef ONLINE
16 #else
17 freopen("F:\\t1.txt","r",stdin);
18 freopen("F:\\t2.txt","w",stdout);
19 #endif
20 }
21
22 void dfs(int row,int deepth)
23 {
24 if(deepth==num)
25 {
26 sum++;
27 return;
28 }
29 if(row>size) //显然这个判断要放后面
30 return ;
31 for(int i=1;i<=size;i++)
32 {
33 if(map[row][i]=='#'&&vrow[row]&&vcolumn[i])
34 {
35 vrow[row]=false;
36 vcolumn[i]=false;
37 dfs(row+1,deepth+1);
38 vrow[row]=true;
39 vcolumn[i]=true;
40 }
41 }
42 dfs(++row,deepth);
43 }
44
45 void init()
46 {
47 cin>>size>>num;
48 while(size!=-1||num!=-1)
49 {
50 sum=0;
51 memset(map,'.',sizeof(map));
52 memset(vrow,true,sizeof(vrow));
53 memset(vcolumn,true,sizeof(vcolumn));
54 for(int i=1;i<=size;i++)
55 for(int j=1;j<=size;j++)
56 cin>>map[i][j];
57 dfs(1,0);
58 cout<<sum<<endl;
59 cin>>size>>num;
60 }
61 }
62
63
64 int main()
65 {
66 online();
67 init();
68 return 0;
69 }

明天开讨论会,还要准备PPT,明天再总结。。。

 

想了一个内环,其中42语句改成dfs(row+1,step)也可以。

 

另外附加两个比较简洁的写法,是网上找的。。。

 

这个有状态压缩。

http://www.cnblogs.com/staginner/archive/2011/08/23/2151384.html

 

这个要从他的写法里学会用while写深搜。。。

其中对pos++这一句很经典,和我的42行一样,需要仔细思考。

为什么我的不能写row++,为什么他的写dfs(pos+1,a)就会超时?

http://www.cnblogs.com/rainydays/archive/2011/06/21/2086386.html

posted @ 2011-10-27 02:36  YipWingTim  阅读(230)  评论(0编辑  收藏  举报