POJ 1321
Posted 一个_小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1321相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章