#include <stdio.h>
#include <stdlib.h>
const int step[4][2]={-1,0,0,1,1,0,0,-1};//上下左右四个方向
char maze[10][10];
int ex,ey,t,YS,n,m;
void dfs(int x,int y)
{
/*for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%c",maze[i][j]);
printf("\n");
}
printf("%d--",t);*/ //走一步打印一下表当前的情况和时间
if(x==ex&&y==ey&&t==0)
{ YS=1; return ;}
else if(x==n||y==m||x==-1||y==-1)
return ;
int d = t-abs(x-ex)-abs(y-ey);
if(d<0||d%2==1) return ;
for(int i=0;i<=3;i++)
{
if((maze[x+step[i][0]][y+step[i][1]]=='.'||maze[x+step[i][0]][y+step[i][1]]=='D')&&t>0)
{
t=t-1;
//printf("%d--%d--%d\n\n",i,x+step[i][0],y+step[i][1]);
maze[x+step[i][0]][y+step[i][1]]='X';
dfs(x+step[i][0],y+step[i][1]);
if (YS) return ;
maze[x+step[i][0]][y+step[i][1]]='.';
t=t+1;
}
}
}
int main()
{
int sx,sy,wall;
while(scanf("%d%d%d",&n,&m,&t)&&(n!=0||m!=0&&t!=0))
{
wall=0,YS=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf(" %c",&maze[i][j]);
if(maze[i][j]=='S')
{ sx = i , sy = j ; maze[i][j]='X';}
else if(maze[i][j]=='D')
{ ex = i , ey = j; }
else if(maze[i][j]=='X')
wall++;
}
// printf("%d %d %d %d %d\n",sx,sy,ex,ey,wall); 打印一下入口和出口
if((abs(sx-ex)+abs(sy-ey)>t)||m*n-wall<=t)
printf("NO\n");
else
{
dfs(sx,sy);
if(YS) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
虽然这道题这各个oj上都被刷烂了,但是我去WA了好几次,还有重要的是减枝
一个是奇偶减枝,一个是边界减枝