dfs求助
  • 板块学术版
  • 楼主luoyx6
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/31 19:46
  • 上次更新2024/8/31 22:29:37
查看原帖
dfs求助
1300704
luoyx6楼主2024/8/31 19:46

杭电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;
}
2024/8/31 19:46
加载中...