题目大意:
输入N,M,表示迷宫的长宽,T表示需要恰好在第T秒到达D点,起始位置S点;
深搜+剪枝(奇偶剪枝)点击打开链接
设起点为(x1,y1),(x2,y2)
abs(x2-x1)+abs(y1-y2)的奇偶性与T的奇偶性相同!
因为题目要求t秒恰好到达,所以(t-step)的奇偶性与abs(x2-x1)+abs(y2-y1)的奇偶性相同
因此int temp=(t-step)-(abs(x2-x1)+abs(y2-y1))必须为偶数,step为已走过的秒数
#include<iostream>
#include<cstring>
#include<cstdlib>
#define MAX 10
using namespace std;
char map[MAX][MAX];
int N,M,T;
int s_x,s_y,f_x,f_y;
int floag;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y,int step){
int temp;
if(x==f_x && y==f_y && step==T){
floag=1;
return;
}
temp=T-step-(abs(f_x-x)+abs(f_y-y)); //奇偶剪枝
if( temp%2 ==1 || temp<0)
return;
for(int i=0;i<4;i++){
if(x+dir[i][0]>0 &&x+dir[i][0]<=N && y+dir[i][1]>0 &&y+dir[i][1]<=M ){
if(map[x+dir[i][0]][y+dir[i][1]]!='X'){
map[x+dir[i][0]][y+dir[i][1]]='X';
dfs(x+dir[i][0],y+dir[i][1],step+1);
/*
dfs(x-1,y,step+1);
dfs(x+1,y,step+1);
dfs(x,y-1,step+1);
dfs(x,y+1,step+1);
*/
if(floag)
return;
map[x+dir[i][0]][y+dir[i][1]]='.';
}
}
}
return;
}
int main(){
while (cin>>N>>M>>T && (M+N+T)!=0)
{
int wall=0;
s_x=s_y=f_x=f_y=0;
memset(map,0,sizeof(map));
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
cin>>map[i][j];
if(map[i][j]=='S'){
s_x=i;
s_y=j;
}
if(map[i][j]=='D'){
f_x=i;
f_y=j;
}
if(map[i][j]=='X')
wall++;
}
}
if(T>=N*M-wall){ //剪枝,当时间t大于可走的路数时,到不了,剪掉
cout<<"NO\n";
continue;
}
floag=0;
map[s_x][s_y]='X';
dfs(s_x,s_y,0);
if(floag)
printf("YES\n");
else
printf("NO\n");
}
//system("pause");
}