杭电OJ第1010题,大致意思是dfs走迷宫,S是起点,D是终点,X是障碍不能通过,‘.’表示可以通过。
我的代码能通过样例,但是提交还是wrong answer ,请问我哪里出错了
#include<bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,ex,ey;
int nx,ny;
int za = 0;
bool escape = 0;
int vis[9][9];
char mp[9][9];
int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
void dfs(int x,int y,int cnt){
if(x>n||x<1||y>m||y<1) return;
if(mp[x][y]=='X') return;
if((t-cnt-abs(x-ex)-abs(y-ey)) < 0) return; //绕路了,剩下的时间不够走到终点了
if(cnt == t&&x==ex&&y==ey) escape = 1;
if(escape) return;
for(int i = 0;i<=3;i++){
nx = x+dir[i][0];
ny = y+dir[i][1];
if(vis[nx][ny]==0){
vis[nx][ny] = 1;
dfs(nx,ny,cnt+1);
vis[nx][ny] = 0;
}
}
return;
}
int main(){
while(cin>> n>> m >> t){
if(n==0&&m==0&&t==0) break;
else{
escape = 0;
za = 0;
memset(vis,0,sizeof(vis));
for(int i = 1;i<=n;i++){
for(int j= 1;j<=m;j++){
cin >> mp[i][j];
if(mp[i][j] == 'S'){
sx = i;
sy = j;
vis[sx][sy] =1;
}
if(mp[i][j] == 'X'){
za+=1;
}
if(mp[i][j]== 'D'){
ex = i;
ey = j;
}
}
}
if((abs(sx-ex)+abs(sy-ey))>t){
escape = 0;
printf("NO\n");
continue;
}
if(n*m-za<=t){
escape = 0;
printf("NO\n");
continue;
}
if((t-abs(sx-ex)-abs(sy-ey))%2==1){ //奇偶性剪枝
escape = 0;
printf("NO\n");
continue;
}
dfs(sx,sy,0);
if(escape == 0){
printf("NO\n");
}
if(escape){
printf("YES\n");
}
}
}
return 0;
}