对于递归+回溯,我确信这道题让我又理解的更加深刻了,自己想了好几天,设计了好多次dfs,总是差一点,终于还是和队友讨论了,这个弯才转过来,自己想了好多次了,也具体的画了一下代码执行过程,顿觉茅舍顿开啊!
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STOP system("pause")
int a[8][8],m,n,sum,flag,count;
void dfs(int x,int y)
{
if(a[x][y]!=1||flag) //若是石头或者已经YES了,跳出
return ;
else
{
a[x][y]=2;
count++;
if(count==sum)
{
printf("YES\n");
flag=1;
return;
}
else
{
dfs(x,y+1);
dfs(x+1,y);
dfs(x,y-1);
dfs(x-1,y);
count--; //反标记,步数反减
a[x][y]=1;
}
}
}
int main()
{
int i,j;
char s[9];
while(scanf("%d%d",&n,&m)&&n)
{
flag=sum=count=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%s",s);
for(j=0;j<m;j++)
if(s[j]=='.')
{
a[i+1][j+1]=1;
sum++;
}
}
dfs(1,1);
if(!flag)
printf("NO\n");
}
return 0;
}