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

POJ 1321

时间:2016-05-20 21:07:40      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

http://poj.org/problem?id=1321

一道深搜的题目,和那个POJ3740有点相类似。

也是到了现在我才知道原来深搜也有几种套路的,以前我的都是用队列来做,那个是不需要记住什么的,只需要标记就行,但现在的做的都好像与路径有点关系。需要用到回溯,这让我还是有点懵的。

 

题目是中文题。就是在棋盘放置棋子,但那个每一行每一列只可以放一个棋子。且只可以放在#的位置,求一共有多少种放法。

 

 Memory:312K c++ runtime:32MS 
1
#include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 5 char str[10][10]; 6 int m,k,ans; 7 int used[10]; //用来记录那一列是不是放了棋子的。 8 9 int dfs(int row,int num) //row代表行,num代表有还有多少个棋子需要放 10 { 11 for(int j=0;j<m;j++) //循环找出这一行一共有几个地方可以放 12 { 13 if(str[row][j]==#&&!used[j]){    14 if(num==1)    //如果还有最后一个棋子了。那么答案就就加一。 15 ans++; 16 else{ 17 used[j]=1; //如果还有多个,首先假设使用了这一个棋子,然后在进行下一步的试探,看这个是不是可用 18 for(int i=row+1;i<m;i++) 19 dfs(i,num-1); 20 used[j]=0; 21 } 22 } 23 } 24 } 25 26 int main() 27 { 28 while(scanf("%d%d",&m,&k)&&(m!=-1||k!=-1)) 29 { 30 for(int i=0;i<m;i++) 31 scanf("%s",str[i]); 32 ans=0; 33 memset(used,0,sizeof(used)); 34 for(int i=0;i<m;i++) 35 dfs(i,k); 36 printf("%d\n",ans); 37 } 38 }

 

POJ 1321

标签:

原文地址:http://www.cnblogs.com/Tree-dream/p/5513391.html

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