POJ 1321-棋盘问题 简单搜索DFS

来源:互联网 发布:java 泛型类 静态方法 编辑:程序博客网 时间:2024/05/21 06:52
#include<stdio.h>                  //POJ 1321-棋盘问题 简单搜索DFS  
#include<string.h>            //   http://acm.pku.edu.cn/JudgeOnline/problem?id=1321
char c[10][10];                       
int f,ans,vis[20],n,k;
void dfs(int m,int i)
{
int nn,l,ii;
//printf("dffvcfb %d %d\n",m+1,i+1);
if(vis[i]==1) return;                 //vis[i]为当前列数标记
f++,vis[i]=1;                          //f为已摆放棋子个数
if(f==k)
{
//printf("dffvcfb\n");
ans++,f--,vis[i]=0;
return;
}
for(nn=m+1;nn<n;nn++)                   //重复遍历,从下一行开始
{
l=strlen(c[nn]);
for(ii=0;ii<l;ii++)
if(c[nn][ii]=='#') dfs(nn,ii);
}
f--;
vis[i]=0;    // 没这个  wa了几次 ~~                
return;
}
int main()
{
int m,l,i;
while(~scanf("%d%d",&n,&k))             //n为行列数,k为需摆放棋子个数
{
if(n==-1||k==-1) break;
ans=0,f=0;
memset(c,0,sizeof(c));
memset(vis,0,sizeof(vis));
getchar();
for(m=0;m<n;m++)
gets(c[m]);        //存数据
for(m=0;m<n;m++)      //遍历每个'#',将其作为第一个放置的棋子
{
l=strlen(c[m]);
for(i=0;i<l;i++)
if(c[m][i]=='#')
{
//printf("%d\n",m+1);
dfs(m,i);
memset(vis,0,sizeof(vis));
}
}
printf("%d\n",ans);
}
}
/*
2 1
#.
.#
4 3
#..#
..#.
.#..
#..#
4 2
...#
.##.
.#..
##.#
4 2
...#
..#.
.#..
#...
4 2
...#
.#..
.#..
#...
4 2
....
....
.#..
#...
2 2
##
##
3 2
###
.##
###
-1 -1
*/
0 0