POJ3984 迷宫问题【BFS】

题目链接:

http://poj.org/problem?id=3984

题目大意:

用一个5*5的二维数组表示迷宫,输出左上角到右下角的最短路径。

思路:

用BFS求最短路径。用pre[]来记录每个状态之前的状态,然后递归输出路径。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int Map[6][6],vis[6][6],pre[110];
//pre[]记录每个状态的前一个状态
struct Cam
{
    int x,y;
}List[110];

int Dire[4][2] = {-1,0,1,0,0,-1,0,1};   //上下左右四个方向

int Go(int x,int y) //判断是否可走
{
    if(x >= 0 && x < 5 && y >= 0 && y < 5 && Map[x][y] == 0)
        return 1;
    return 0;
}

void Print(int x)   //输出路径
{
    int t;
    t = pre[x];
    if(t == 0)
    {
        printf("(0, 0)\n");
        printf("(%d, %d)\n",List[x].x,List[x].y);
        return ;
    }
    else
        Print(t);
    printf("(%d, %d)\n",List[x].x,List[x].y);
}

void BFS()
{
    memset(vis,0,sizeof(vis));
    int Head = 0,Tail = 1;
    List[0].x = 0;
    List[0].y = 0;
    pre[0] = -1;
    while(Head < Tail)  //队列
    {
        int x = List[Head].x;
        int y = List[Head].y;
        if(x == 4 && y == 4)
        {
            Print(Head);
            return ;
        }
        for(int i = 0; i < 4; ++i)
        {
            int xx = x + Dire[i][0];
            int yy = y + Dire[i][1];
            if( !vis[xx][yy] && Go(xx,yy) )
            {
                vis[xx][yy] = 1;
                List[Tail].x = xx;
                List[Tail].y = yy;
                pre[Tail] = Head;
                Tail++;
            }
        }
        Head++;
    }
    return ;
}

int main()
{

    for(int i = 0; i < 5; ++i)
        for(int j = 0; j < 5; ++j)
            scanf("%d",&Map[i][j]);
    BFS();

    return 0;
}
时间: 2024-11-12 04:26:51

POJ3984 迷宫问题【BFS】的相关文章

POJ3984 迷宫问题【水BFS】

#include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> #include <map> #include <vector> using namespace std; map<string,int>mymap; map<stri

搜索问题——POJ3984迷宫问题

Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. Input 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. Output 左上角到右下角的最短路径,格式如样例所示. Sa

hdu 1728 逃离迷宫 (BFS)

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

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

迷宫问题 BFS入门水题

1102:迷宫问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:84 解决: 41 题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行是两个整数N和M(1<=N,M<=100). 接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格. 字符的含义如下: 'S':起点 'E':终点 '-':空地,可以通过 '#':障碍,无法通

hdu 1728 逃离迷宫 (bfs+循环队列)

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

POJ-3984 迷宫问题(BFS找最短路径并保存)

问题: 定义一个二维数组:  int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 输入: 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. 输出: 左上角到右下角的最短路径,格式如样例所示. //#include <bi

poj3984 迷宫问题(简单的输出路径的bfs)

题目链接 http://poj.org/problem?id=3984 中文题题意不解释了 反正就是简单的结构体套结构体存一下路径就行了 #include <iostream> #include <cstring> #include <deque> #include <queue> using namespace std; int map[6][6]; struct ss { int x , y; }; struct TnT { deque<ss>

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using