0
已解决
汪恺恒
中级启示者
中级启示者
题目描述 Description
在一个m*n的迷宫中,布满了重重陷阱。迷宫里有陷阱的房间是不能踏足的,在任意一个不是陷阱的房间可以朝周围的8个方向的没有陷阱的房间继续探索。现在给出起点坐标(a,b)和终点坐标(x,y),试判断能否从起点到达终点。
输入描述 Input Description
第一行,两个由空格隔开的整数,m n
第二行,四个由空格隔开的整数,a b x y
接下来m行,每行n个整数,为0或1,0表示不是陷阱,1表示陷阱
输出描述 Output Description
如果能到达终点输出最少需要的步数;否则输出-1
TLE 1个点,求优化
#include<bits/stdc++.h>
#include<iostream>
#pragma GCC optimize(3)
using namespace std;
int n,m,t,sx,sy,ex,ey,ans=0x3f3f3f3f;
int dir[10][2]={{0},{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
int vis[25][25];
bool a[25][25];
void dfs(int x,int y,int cnt){
if(cnt>=ans) return ;//剪枝
if(x==ex&&y==ey){
ans=min(ans,cnt);
return ;
}
for(int i=1;i<=8;i++){
int dx=x+dir[i][0],dy=y+dir[i][1];
if(dx>=1&&dy>=1&&dx<=n&&dy<=m && !vis[dx][dy]&&!a[dx][dy]){
a[dx][dy]=true;
dfs(dx,dy,cnt+1);
a[dx][dy]=false;
}
}
return ;
}
int main(){
cin>>n>>m>>sx>>sy>>ex>>ey;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>vis[i][j];
}
}
a[sx][sy]=true;
dfs(sx,sy,0);
if(ans!=0x3f3f3f3f) cout<<ans;
else cout<<-1;
return 0;
}