简单的迷宫(bfs)noj1793

题目描述

睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么…

不管那么多了,还是先离开为妙。不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么?

这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M)。除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点。

输入

组数据输入。

每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2,

接下来k行,每行两个整数xi,yi,表示第i个障碍物的坐标,障碍物之间不会重复,坐标均1<=xi<=N,1<=yi<=M;

输出

每组数据输出一个整数,最短路径长度,如果Bob不能到达终点,则输出-1;

样例输入

5 5 8
4 3
4 5
5 2
2 2
1 5
3 3
5 1
1 4

5 5 8
1 2
2 2
3 2
4 2
2 4
3 4
4 4
5 4

样例输出

8
16

提示

undefined

题目来源

L.G.

#include <iostream>
#include<queue>
#include<cstring>
using namespace std;
int ma[100][100],vis[100][100];
int dirx[4] = {1,-1,0,0};   //四个方向
int diry[4] = {0,0,-1,1};
struct node{
int x,y,step;
} ;
int n,m;
int bfs(){
queue<node> p;
node next,now;
now.x=1,now.y=1,now.step=0;
p.push(now);
while(!p.empty())
{
    now=p.front();
    p.pop();
    for(int i=0;i<4;i++)
    {
        next=now;
        next.x+=dirx[i];
        next.y+=diry[i];
        next.step++;
        if(next.x==n&&next.y==m)return next.step;
        if(ma[next.x][next.y]&&!vis[next.x][next.y])
        {vis[next.x][next.y]=1;
        p.push(next);
        }
    }

}

return -1;
}

int main(){
int  l;
while(cin>>n>>m>>l)
{int x,y;
    memset(ma,1,sizeof(ma));
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n+1;i++)
        ma[i][0]=ma[i][m+1]=0;
    for(int i=0;i<=m+1;i++)
        ma[0][i]=ma[n+1][i]=0;
    for(int i=0;i<l;i++)
    {cin>>x>>y;
         ma[x][y]=0;
    }

cout<< bfs()<<endl;

}

return 0;}

时间: 2024-10-26 15:07:28

简单的迷宫(bfs)noj1793的相关文章

ZOJ 1649 Rescue(有敌人迷宫BFS)

题意 求迷宫中从a的位置到r的位置需要的最少时间  经过'.'方格需要1s  经过'x'方格需要两秒  '#'表示墙 由于有1s和2s两种情况  需要在基础迷宫bfs上加些判断 令到达每个点的时间初始为无穷大  当从一个点到达该点用的时间比他本来的时间小时  更新这个点的时间并将这个点入队  扫描完全图就得到答案咯 #include<cstdio> #include<cstring> #include<queue> using namespace std; const

20150917学习内容: 数组,简单的迷宫操作

数组:有固定长度的同种类型的一组变量,有索引,索引从0开始. Int [ ]shuzu = new int[5]; shuzu [0] = 4; shuzu [1] = 6; 或直接赋值: int[]shuzu = new int[5]{2,4,5,7,9}; Console.Write(shuzu[3]); Console.Readline(); 这是一维数组, 二维数组是: int[,] erwei = new int[2,5];   =========>两个长度为5的一维数组 赋值: In

实现简单的迷宫

我们知道栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.   所以我们利用栈这个特点,来实现这个迷宫.在这之中我们要采用"回溯"的方法去处理当遇到路径不通的情况.   原理:每找到一个通路,就将这个数据压栈,这样当前位置的上一个位置就位于栈的顶部,假如当前位置的上下左右都找不到通路的时候,就开始回溯,也就是开始从来的路往回走,而之前走过的路都存在栈里面,所以只需要一个一个的Pop就能依次往回退,每

bfs简单应用----迷宫问题

[week2-A] 东东有一张地图,想通过地图找到妹纸.地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0.既然已经知道了地图,那么东 东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线. Input 输入是一个5 × 5的二维数组,仅由0.1两数字组成,表示法阵地图. Output 输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示.数据保证有唯一解. Sample Input 0 1 0 0 00 1 0 1 00 1 0

HDU1728-逃离迷宫-BFS

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27258    Accepted Submission(s): 6661 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越, 有些地

HDU 2102 A计划 (三维的迷宫BFS)

题目链接:pid=2102">传送门 题意: 三维的一个迷宫,起点在第一层的S(0,0,0)处,问是否能在规定的时间内走到第二层的P 处.'*'代表不能走,'.'代表能够走,'#'代表传送门,这里有一个trick,走到传送门的时 候必需要传送.之前没有注意到WA了非常多遍. 并且在初始的时候能够对地图进行一下处理,('*','#'),('#','*'),('#','#')这种肯定 是不能够走的,所以能够把他们都变成'*' 代码例如以下: #include <iostream>

hdu 1728 逃离迷宫 bfs记转向

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18702    Accepted Submission(s): 4526 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,g

hdu 1728 逃离迷宫 bfs记步数

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18702    Accepted Submission(s): 4526 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,g

经验分享:三套简单的迷宫地图生成方案

转自:http://www.gameres.com/754927.html 概述:文章基于一种基础的地图,来讨论三套不同的地图生成方案. 文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案.其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样,适合自己游戏的才是最好的). 根据方案生成地图之后,还可以加上一些静态分布来丰富地图表现,大家就自行发挥啦! 地图基础 地图的形式很多,这里我使用的地图是以tile块为单位分割的地