问题标题: 酷町堂:萌新求助 3706 走迷宫

0
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;
}

 


0
已采纳
董子墨
董子墨
中级天翼
中级天翼

如果终点有陷阱,直接输出-1

0
汪宇航
汪宇航
新手启示者
新手启示者

如果终点是陷阱,输出-1

我要回答