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;
}
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
原文地址:https://www.cnblogs.com/ruojisun/p/6481164.html