zoukankan      html  css  js  c++  java
  • BFS迷宫问题

    链接:https://ac.nowcoder.com/acm/challenge/terminal
    来源:牛客网

    小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
    小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。
    障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
    小明想要知道,现在他能否从起点走到终点。

    输入描述:

    本题包含多组数据。
    每组数据先输入两个数字N,M
    接下来N行,每行M个字符,表示地图的状态。
    数据范围:
    2<=N,M<=500
    保证有一个起点S,同时保证有一个终点E.

    输出描述:

    每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No
    示例1

    输入

    复制
    3 3
    S..
    ..E
    ...
    3 3
    S##
    ###
    ##E

    输出

    复制
    Yes
    No

    解题思路:经典BFD
    #pragma GCC optimize(2)
    #include<bits/stdc++.h>
    using namespace std;
    inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
    typedef long long ll;
    const int maxn = 1e5+10;
    char a[600][600];
    int vis[600][600];
    struct node{
        int x,y;
    };
    int d[4][2]={0,1,0,-1,1,0,-1,0};
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF){
            node S;//记录起点
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    cin>>a[i][j];
                    if(a[i][j]=='S'){
                        S.x=i;
                        S.y=j;
                    }
                }
            }
            int flag=0;
            memset(vis,0,sizeof(vis));//清空标记数组 
            queue<node>q;//定义队列 
            q.push(S);//弹入起点 
            while(!q.empty()){
                node temp=q.front();//判断 
                q.pop();//弹出站首
                if(a[temp.x][temp.y]=='E'){
                    flag=1;
                    break;
                }
                vis[temp.x][temp.y]=1;
                for(int i=0;i<4;i++){
                    node R;
                    R.x=temp.x+d[i][0];
                    R.y=temp.y+d[i][1];
                    if(R.x>=1&&R.x<=n&&R.y>=1&&R.y<=m&&vis[R.x][R.y]==0&&a[R.x][R.y]!='#'){
                        vis[R.x][R.y]=1;
                        q.push(R);//入栈等待判断 
                    }
                } 
            }
            if(flag==1){
                printf("Yes
    "); 
            } 
            else{
                printf("No
    ");
            } 
        }
        return 0;
    }

    AC代码2;

    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    char map[600][600];
    char s[100];
    bool vis[600][600];
    struct Node{
        int x,y;
    };
    int d[4][2]={0,1,0,-1,1,0,-1,0};
    int main()
    {
        int N,M;
        while(scanf("%d%d",&N,&M)!=EOF)
        {
            Node S;
            gets(s);//getchar();
            for(int i=1;i<=N;i++){
                for(int j=1;j<=M;j++){
                    scanf("%c",&map[i][j]);
                    if(map[i][j]=='S'){
                        S.x=i;
                        S.y=j;
                    }
                }
                gets(s);
            }
            int flag=0;
            memset(vis,0,sizeof(vis));
            queue<Node>q;
            q.push(S);
            while(!q.empty())
            {
                Node temp=q.front();
                q.pop();
                if(map[temp.x][temp.y]=='E')
                {flag=1;break;}
                vis[temp.x][temp.y]=1;
                for(int i=0;i<4;i++)
                {
                    Node R;
                    R.x=temp.x+d[i][0];R.y=temp.y+d[i][1];
                    if(R.x<1||R.y<1||R.x>N||R.y>M) continue;
                    if(!vis[R.x][R.y]&&map[R.x][R.y]!='#')
                    {
                        vis[R.x][R.y]=1;
                        q.push(R);
                    }
                }
            }
            if(flag) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }

  • 相关阅读:
    python学习笔记(unittest)
    python学习笔记(session)
    python学习笔记(requests)
    jmeter的学习(配置环境)
    Codeforces 576D. Flights for Regular Customers 题解
    Codeforces 1316F. Battalion Strength 题解
    2020年第十一届蓝桥杯省赛J-网络分析(带权并查集)
    第十一届蓝桥杯b组省赛 C.合并检测(内附详细的样例)
    蓝桥杯2020.7月真题走方格(到达终点的不同方案数)(记忆化搜索+DP)
    Codeforces Global Round 11 A. Avoiding Zero(思维构造)
  • 原文地址:https://www.cnblogs.com/lipu123/p/12151857.html
Copyright © 2011-2022 走看看