思路:规定时刻到达终点,dfs即可,注意走过消失即可
剪枝:奇偶剪枝,设x为最短路程(直接到达),t为规定时间,t>=x&&(t-x)%2==0否则不可能到达
#include<stdio.h>
#include<string.h>
#define MAX 10
int n,m,k;
char map[MAX][MAX];
int visit[MAX][MAX];
int dfs(int x,int y,int num){
visit[x][y]=1;
if(x<1||x>n||y<1||y>m||map[x][y]=='X'){return 0;}
if(map[x][y]=='D'&&num==k)return 1;
if(num>=k){visit[x][y]=0;return 0;}
if(!visit[x][y+1]){
if(dfs(x,y+1,num+1)==1)return 1;
else{
visit[x][y+1]=0;
}
}
if(!visit[x][y-1]){
if(dfs(x,y-1,num+1)==1)return 1;
else{
visit[x][y-1]=0;
}
}
if(!visit[x-1][y]){
if(dfs(x-1,y,num+1)==1)return 1;
else{
visit[x-1][y]=0;
}
}
if(!visit[x+1][y]){
if(dfs(x+1,y,num+1)==1)return 1;
else{
visit[x+1][y]=0;
}
}
return 0;
}
int main(){
int i,j;
int xs,ys,xe,ye;
int dis=0;
while(scanf("%d%d%d",&n,&m,&k),n||m||k){
getchar();
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='S'){xs=i;ys=j;}
if(map[i][j]=='D'){xe=i;ye=j;}
}
getchar();
}
dis=0;
dis+=xs>xe?xs-xe:xe-xs;
dis+=ys>ye?ys-ye:ye-ys;
if(dis>k||(k-dis)%2){printf("NO\n");continue;}
if(dfs(xs,ys,0))printf("YES\n");
else printf("NO\n");
}
return 0;
}
剪枝:奇偶剪枝,最短路径为x,规定时间为t,则t>=x&&(t-x)%2==0不然不可能到达