zoukankan      html  css  js  c++  java
  • codevs 3344 迷宫

    时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold
    题目描述 Description

    小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

    输入描述 Input Description

    第一行有三个数n,m表示迷宫有n行,m列。

    第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

    输出描述 Output Description

    至少走几步可以按规定走完,如果不行,输出“Impossible”

    样例输入 Sample Input

    5 5

    A002B

    022C0

    000D0

    00222

    0000E

    样例输出 Sample Output

    26

    数据范围及提示 Data Size & Hint

    0%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“B”。

    30%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“G”。

    50%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“Z”。

    10%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“B”。

    30%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“G”。

    100%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“Z”。

    bfs

    屠龙宝刀点击就送

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    struct node
    {
        int x,y;
        char ch;
    }zm[27];
    int fx[5]={1,-1,0,0},fy[5]={0,0,-1,1};
    int h,tot,n,m,i,j;
    bool vis[101][101];
    char atlas[101][101];
    bool cmp(node a,node b)
    {
        return int(a.ch)<int(b.ch);
    }
    int dfs(int sx,int sy,int ox,int oy)
    {
        int f[10001][3],head=0,tail=1;
        f[tail][1]=sx;
        f[tail][2]=sy;
        f[tail][3]=1;
        vis[sx][sy]=1;
        do
        {
            head++;
            int x=f[head][1],y=f[head][2];
            for(int k=0;k<4;++k)
            {
                int lx=x+fx[k],ly=y+fy[k];
                if(lx>=0&&lx<n&&ly>=0&&ly<m&&!vis[lx][ly]&&atlas[lx][ly]!='2')
                {
                    f[++tail][1]=lx;
                    f[tail][2]=ly;
                    f[tail][3]=f[head][3]+1;
                    vis[lx][ly]=1;
                    if(lx==ox&&ly==oy)
                    return f[head][3];
                }
            }
        }while(head<=tail);
        return 0;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;++i)
        {
            for(j=0;j<m;++j)
            {
                cin>>atlas[i][j];
                if(atlas[i][j]>='A'&&atlas[i][j]<='Z')
                {
                    zm[tot].x=i;
                    zm[tot].y=j;
                    zm[tot].ch=atlas[i][j];
                    tot++;
                }
            }
        }
        sort(zm,zm+tot,cmp);
        for(i=0;i<tot;++i)
        {
            if(i<tot-1)
            {
                memset(vis,0,sizeof(vis));
                int k=dfs(zm[i].x,zm[i].y,zm[i+1].x,zm[i+1].y);
                if(k)
                h+=k;
                else 
                {
                    printf("Impossible");
                    return 0;
                }
            }
            else
            {
                memset(vis,0,sizeof(vis));
                int k=dfs(zm[i].x,zm[i].y,zm[0].x,zm[0].y);
                if(k)
                h+=k;
                else 
                {
                    printf("Impossible");
                    return 0;
                }
            }
        }
        printf("%d",h);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    【设计模式(17)】行为型模式之中介者模式
    服务器迁移--MySQL数据库迁移
    巧妙解决element-ui下拉框选项过多的问题
    关于后台返回的文件流下载方法
    关于input框只让输入数字的写法
    关于element ui 全局配置某些组件的属性方法
    关于echarts的南丁格尔玫瑰图 极值导致展示效果不好的解决方案
    mock数据的使用方法
    配置 git账号和邮箱
    vite 发布了正式版版了 用起来
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6481164.html
Copyright © 2011-2022 走看看