#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int v[9][9];
int dx,dy,t;
int flag;
void dfs(int x,int y,int c)
{
int temp;
if(flag)
return ;
temp=abs(1.0*dy-y)+abs(1.0*dx-x);
if(temp>t-c) //剪枝
return ;
temp=t-c-temp;
if(temp%2||temp<0)//重要的奇偶剪枝
return ;
if(c==t) //理论上这里应该(x==dx&&y==dy&&c==t)的,不知道为什么还是过了
{flag=1;return ;}
if(c>t)
return ;
v[x][y]=0;
if(v[x+1][y])
dfs(x+1,y,c+1);
if(v[x-1][y])
dfs(x-1,y,c+1);
if(v[x][y+1])
dfs(x,y+1,c+1);
if(v[x][y-1])
dfs(x,y-1,c+1);
v[x][y]=1;
}
int main()
{
freopen("in.txt","r",stdin);
int i,j,n,m,sx,sy;
char c;
while(scanf("%d%d%d",&n,&m,&t),n||m||t)
{ memset(v,0,sizeof(v));
getchar();
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{
c=getchar();
switch(c)
{
case '.':v[i][j]=1;break;
case 'S':v[i][j]=1;sx=i;sy=j;break;
case 'D':v[i][j]=1;dx=i;dy=j;break;
}
}
getchar();
}
flag=0;
dfs(sx,sy,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
//据说这道搜索题具有里程碑意义,看到自己的代码500多Ms,不爽,看了下别人的,居然有大牛0Ms,
于是简单的修改了下,就150多Ms了,如果来个BFS估计还会更快,体验到了搜索剪枝的强大了!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int v[9][9];
int dx,dy,t;
int flag;
void dfs(int x,int y,int c)
{
int temp;
if(flag)
return ;
temp=t-c-abs(1.0*dy-y)-abs(1.0*dx-x);
if(temp%2||temp<0)
return ;
if(x==dx&&y==dy&&c==t)
{flag=1;return ;}
v[x][y]=0;
if(v[x+1][y])
dfs(x+1,y,c+1);
if(v[x-1][y])
dfs(x-1,y,c+1);
if(v[x][y+1])
dfs(x,y+1,c+1);
if(v[x][y-1])
dfs(x,y-1,c+1);
v[x][y]=1;
}
int main()
{ int i,j,n,m,sx,sy,nt;
char c;
while(scanf("%d%d%d",&n,&m,&t),n||m||t)
{ memset(v,0,sizeof(v));
getchar();nt=0;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{
c=getchar();
switch(c)
{
case '.':v[i][j]=1;nt++;break;
case 'S':v[i][j]=1;sx=i;sy=j;break;
case 'D':v[i][j]=1;dx=i;dy=j;nt++;break;
}
}
getchar();
}
if(nt<t||abs(1.0*dy-sy)+abs(1.0*dx-sx)>t)//就加这点,就快了几百Ms,唉,问题看来就在这,
printf("NO\n"); //这里的nt用BFS遍历求最短的话,会更快,大牛0Ms估计就这么来的
else
{ flag=0;
dfs(sx,sy,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
--------江财小子