题目连接:http://poj.org/problem?id=1321编程
Time Limit: 1000MS Memory Limit: 10000K函数
Description测试
Inputspa
Outputcode
Sample Inputblog
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Outputip
2 1
能够说是很是经典的一道DFS题目了,不说有多难,可是能够很好地体现出DFS的思想。get
对于一个n*n的棋盘,咱们考虑按行进行DFS,一行一行往下推动就相似于DFS一层一层往下搜索。string
对于函数dfs(int row,int num),row表示当前进行到哪一行,num表明到目前为止,棋盘上已经放了多少棋子了。it
那么,在dfs()这个函数中,显然要对row这行上的每一格进行一次遍历(一次for循环);
遍历的过程当中,遇到能放棋子的格子(两个要求:①这一格确实是属于棋盘的 map[i][j]='#' ; ②这一列上,上面那几行没有放过棋子 vis[col]==0 ),那就无论了,先放上去再说;
那么咱们放了一颗棋子以后,这行就不能再放了,那就往下走一行dfs(row+1,num+1);
那么咱们dfs(row+1,num+1)这个作完了以后呢?
显然,咱们又不是必定要往这个格子上放旗子,棋盘这么大我想去看看,因此咱们要把以前放下的那颗棋子拿起来,继续在row这行上继续遍历,寻找下一个能放棋子的格子;
最后我若是把这一行所有遍历完了呢?咱们是否是非得往这行上放棋子?
固然不是啦
若是棋子少,这行不放也是能够的呀,因此在一次for循环结束以后,咱们也要往下一行走,即dfs(row+1,num)。
这就是大致上的DFS思路啦,更多细节请详见代码:
1 #include<cstdio> 2 #include<cstring> 3 char map[11][11]; 4 int n,k,ans; 5 bool colvis[11]; 6 void dfs(int row,int num) 7 { 8 if(num==k)//所有chess都已经放完啦! 9 { 10 ans++;//方案数+1 11 return; 12 } 13 if(row>n) return; 14 for(int col=1;col<=n;col++) 15 { 16 if(map[row][col]=='#' && !colvis[col]) 17 { 18 colvis[col]=1; 19 dfs(row+1,num+1); 20 colvis[col]=0; 21 } 22 } 23 dfs(row+1,num); 24 } 25 int main() 26 { 27 while(scanf("%d%d",&n,&k) && n!=-1) 28 { 29 memset(colvis,0,sizeof(colvis)); 30 memset(map,0,sizeof(map)); 31 for(int i=1;i<=n;i++) scanf("%s",map[i]+1); 32 ans=0; 33 dfs(1,0); 34 printf("%d\n",ans); 35 } 36 }
泼妇爱科特!!!