Poj3984--迷宫问题(BFS)

迷宫问题

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 10056   Accepted Submission(s) : 5652

Problem 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

左上角到右下角的最短路径,格式如样例所示。

Sample Input

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

Sample Output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)

Source

PKU

//应该是建邻接表,但我没学会, 话说一组数据的题真的好吗?

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

const int MAX = 10;
struct point
{
    int x,y,pre;
}q[MAX];
int front = 0, rear = 1, sx, sy, ex, ey;
int arr[MAX][MAX];
int dx[4]={1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int n, m;
void output(int i)              //回溯输出; 什么鬼?
{
    if(q[i].pre != -1)
    {
        output(q[i].pre);
        printf("(%d, %d)\n",q[i].x,q[i].y);
    }
}

void bfs(int sx,int sy)
{
    q[front].x = sx;
    q[front].y = sy;
    q[front].pre = -1;
    arr[sx][sy] = 1;
    while(front < rear)     //模拟;
    {
        for(int i=0;i<4;i++)
        {
            int nx = q[front].x + dx[i];
            int ny = q[front].y + dy[i];
            if(nx<0 || nx>=5 || ny<0 || ny>=5 || arr[nx][ny])
                continue;
            else
            {
                arr[nx][ny] = 1;
                q[rear].x = nx;
                q[rear].y = ny;
              // printf("%d %d\n", q[rear].x, q[rear].y);
                q[rear++].pre = front;
            }
            if(nx == 4 && ny == 4)  output(front);
        }
        front++;
    }
}

int main()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
                scanf("%d",&arr[i][j]);
    printf("(0, 0)\n");
    bfs(0,0);
    printf("(4, 4)\n");
    return 0;
} 

//学长的邻接表:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int head[100100],cnt;
 4 struct s
 5 {
 6     int u,v,w;
 7     int next;
 8 }edge[100010];
 9 void add(int u,int v,int w)
10 {
11     edge[cnt].u=u;
12     edge[cnt].v=v;
13     edge[cnt].w=w;
14     edge[cnt].next=head[u];
15     head[u]=cnt++;
16 }
17 int main()
18 {
19     int n;
20     while(scanf("%d",&n)!=EOF)
21     {
22         int i;
23         cnt=0;
24         memset(head,-1,sizeof(head));
25         for(i=0; i<n; i++)
26         {
27             int u,v,w;
28             scanf("%d%d%d",&u,&v,&w);
29             add(u,v,w);
30         }
31         int u;
32         scanf("%d",&u);
33         for(i=head[u]; i!=-1; i=edge[i].next)
34         {
35             int v=edge[i].v;
36             int w=edge[i].w;
37         }
38     }
39     return 0;
40 }

时间: 2024-10-24 16:09:44

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可以穿越,有些地

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

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