逃离迷宫 bfs

原创 2018年04月15日 20:48:47

来源:2018年长沙理工大学第十三届程序设计竞赛
链接https://www.nowcoder.com/acm/contest/96/G

题目描述
给你一个n*m的图,地图上’.’代表可以走的地方,而’#’代表陷阱不能走,
‘P’代表人物位置,’K’代表钥匙,’E’代表出口。人物一个,钥匙有多个,
(’K’的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个
方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙
然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。
输入描述:
第一行一个整数T(T <= 50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表地图的行和列
接下来n行,每行一个长度为m的字符串,组成一个图。
输出描述:
如果可以出去,输出所花费的最少时间。
如果不能出去,输出一行”No solution”。
示例1
输入
3
5 5
….P

..E

K#…

…..
5 5
P….
…..
..E..
…..
….K
5 5
P#..E
.#.#.
.#.#.
.#.#.
…#K
输出
No solution
12
No solution

思路:看到最小,想到广搜,利用结构体,除了定义x,y外,还要定义一个标记变量f,标记到走到E之前有没有走到K,条件

 if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]!='#')
            {
                point p;

                if(vis[tx][ty][qq.f]!=-1)
                    continue;
                if(map[tx][ty]=='K')
                {
                    p.f=1;
                }
                else
                {
                    p.f=qq.f;
                }
                if(map[tx][ty]=='E'&&!qq.f)
                {
                    continue;
                }
                p.x=tx;
                p.y=ty;
                vis[tx][ty][p.f]=vis[qq.x][qq.y][qq.f]+1;//计算步数;
                q.push(p);
            }

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int n,m;
char map[505][505];
int vis[505][505][2];
struct point
{
    int x,y;
    int f;
};
int a[4][2]= {0,1,0,-1,1,0,-1,0};
int bfs(int x,int y)
{
    queue<point>q;
    memset(vis,-1,sizeof(vis));
    point qq;
    qq.x=x;
    qq.y=y;
    qq.f=0;
    vis[x][y][qq.f]=0;
    q.push(qq);
    while(!q.empty())
    {
        qq=q.front();
        q.pop();
        if(map[qq.x][qq.y]=='E'&&qq.f)
            return vis[qq.x][qq.y][1];

        for(int i=0; i<4; i++)
        {
            int tx=qq.x+a[i][0];
            int ty=qq.y+a[i][1];
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]!='#')
            {
                point p;

                if(vis[tx][ty][qq.f]!=-1)
                    continue;
                if(map[tx][ty]=='K')
                {
                    p.f=1;
                }
                else
                {
                    p.f=qq.f;
                }
                if(map[tx][ty]=='E'&&!qq.f)
                {
                    continue;
                }
                p.x=tx;
                p.y=ty;
                vis[tx][ty][p.f]=vis[qq.x][qq.y][qq.f]+1;
                q.push(p);
            }
        }
    }
  return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
        {
            scanf("%s",map[i]);
        }
        int ans=-1;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(map[i][j]=='P')
                {
                    ans=bfs(i,j);
                    break;
                }
            }
        }
        if(ans>0)
        {
            printf("%d\n",ans);
        }
        else
        {
            printf("No solution\n");
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxiaowu547/article/details/79953066

hdu1728逃离迷宫(BFS)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:balabala一大堆,就是说在限制条件内走到终点就算yes; 心得:坑爹啊,今天写了两道bf...
  • qq_29980371
  • qq_29980371
  • 2017-04-24 18:48:34
  • 175

逃离迷宫(bfs)

题意:给出一个图和两个点的坐标,以及一个整数k,求从一个点是否能在k次拐弯内到达另一个点链接: http://acm.hdu.edu.cn/webcontest/contest_showproble...
  • qq_35399846
  • qq_35399846
  • 2016-07-28 09:50:30
  • 182

HDU 1728逃离迷宫(DFS或者BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • opm777
  • opm777
  • 2014-01-11 15:55:49
  • 1461

hdoj 1728 逃离迷宫 【BFS 记录转弯次数】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-05 20:15:58
  • 739

HDU1728 逃离迷宫【BFS】

题目大意: 有一个M*N的矩阵迷宫。其中,字符'.'表示此处为空地,字符'*'表示此处为障碍。在迷宫中,只能向 相邻的上、下、左、右方向走。而且在走的时候,转弯最多不能超过k次。给你初始位置(x1,y...
  • u011676797
  • u011676797
  • 2015-04-05 23:22:28
  • 665

Hdoj 1728 逃离迷宫 【BFS】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • shengweisong
  • shengweisong
  • 2015-05-31 18:13:13
  • 871

hdu 1728 逃离迷宫 (BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。注意不要把行列搞...
  • Zhuhuangjian
  • Zhuhuangjian
  • 2012-12-05 21:35:49
  • 2943

经典迷宫问题 BFS 广度优先

给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可...
  • qq_26891045
  • qq_26891045
  • 2016-03-12 11:17:37
  • 1583

hdu1728 逃离迷宫(bfs限制拐弯次数)

http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给你一张图,*代表墙,.代表路,给你起点终点坐标和限制的拐弯次数,求起点是否可以在拐弯次数内到达终...
  • Flynn_curry
  • Flynn_curry
  • 2016-10-23 13:13:30
  • 494

CDOJ 1088 王之迷宫 BFS

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 王被困在了一个3维的迷宫中,他...
  • code12hour
  • code12hour
  • 2015-06-21 20:06:03
  • 644
收藏助手
不良信息举报
您举报文章:逃离迷宫 bfs
举报原因:
原因补充:

(最多只允许输入30个字)