重点在奇偶剪枝
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
char map[300][300],step[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int a,b,T,ax,ay,bx,by,flag;
int pos(int p) {
return p>0?p:-p;
}
void DFS(int x,int y,int t) {
int temp;
if( x>a|| y>b || x<=0 || y<=0 )
return;
if(t==T&&x==bx&&y==by) {
flag=1;
return ;
}
temp=(T-t)-pos(x-bx)-pos(y-by);//路径剪枝
if(temp<0||temp%2==1) {
return ;
}
for(int i=0; i<4; i++)
{
if(map[x+step[i][0]][y+step[i][1]]!='X')
{
map[x+step[i][0]][y+step[i][1]]='X';
DFS(x+step[i][0],y+step[i][1],t+1);
map[x+step[i][0]][y+step[i][1]]='.';//类似于回溯标记
if(flag) return ;
}
}
}
int main () {
int wall;
int i,j;
while(~scanf("%d%d%d",&a,&b,&T)&&(a+b+T)) {
wall=0;
flag=0;
memset(map,'0',sizeof(map));
for( i=1; i<=a; i++) {
getchar();
for(j=1; j<=b; j++) {
scanf("%c",&map[i][j]);
if(map[i][j]=='S') {
ax=i;
ay=j;
} else if(map[i][j]=='X') {
wall++;
} else if(map[i][j]=='D') {
bx=i;
by=j;
}
}
}
getchar();
if(a*b-wall<=T) { //新技能 节约了很多时间 很棒的方法
printf("NO\n");
continue;
}
map[ax][ay]='X';
DFS(ax,ay,0);
if(flag==1) printf("YES\n");
else printf("NO\n");
}
return 0;
}