题意:
给出一个N*M的矩阵田,里面有石头。 从左上角开始走问能能把不是石头的部分走遍?
分析:
求一条路径,能否覆盖所有要求点。,这个题目wa了几次,一开始中间变量没有作为dfs函数的参数,发现在他回溯以后还是会把本来不应该走的也走了
于是就改了下参数,样例过了...……^_^,悲剧的是还是不行,偶想了想在后面加了个回溯,#%……#¥#@¥%¥真不想说什么就过了。
激动啊。其实不加的话问题也应该不大,,,现在还有带点问题就是什么时候需要回溯?他return以后不是自动到上一步,状态变回去了么...
#include <stdio.h>
char a[15][15];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int flag,num,temp;
void dfs(int x,int y,int temp);
int main()
{
int n,m,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
flag=0;
num=0;
temp=0;
if(n==0&&m==0) break;
for(i=0;i<=n+1;i++)
{
a[i][0]='S';
a[i][m+1]='S';
}
for(j=0;j<=m+1;j++)
{
a[0][j]='S';
a[n+1][j]='S';
}
for(i=1;i<=n;i++)
{
getchar();
{
for(j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='.') num++;
}
}
}
dfs(1,1,1);
if(flag==1) printf("YES\n");
else printf("NO\n");
}
return 0;
}
void dfs(int x,int y,int temp)
{
int i;
if(temp==num) {flag=1;return;}
a[x][y]='S';
for(i=0;i<4;i++)
{
if(a[x+dir[i][0]][y+dir[i][1]]!='S')
dfs(x+dir[i][0],y+dir[i][1],temp+1);
}
a[x][y]='.';
return ;
}