7084:迷宫问题

题目链接:http://noi.openjudge.cn/ch0205/7084/

总时间限制: 1000ms 内存限制: 65536kB
描述

定义一个二维数组:

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的二维数组,表示一个迷宫。数据保证有唯一解。
输出
左上角到右下角的最短路径,格式如样例所示。
样例输入
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
样例输出
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

算法分析:广搜。

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<queue>
  4 using namespace std;
  5 struct obj
  6 {
  7     int xx,yy,index;//index记录(xx,yy)这个点在a[]和pre[]中的下标
  8 };
  9
 10 int n,m;
 11 int map[102][102];
 12 queue<struct obj> q;
 13 struct obj S,T;
 14
 15 struct obj a[102*102+3];
 16 int pre[102*102+3];//pre[i]记录a[i]这个点在广搜中的前驱结点
 17 int index;//a[]和pre[]的下标
 18
 19 int dx[4]={-1,0,1,0};//上右下左
 20 int dy[4]={0,1,0,-1};
 21 void BFS();
 22
 23 int main(int argc, char *argv[])
 24 {
 25     struct obj tt[102*102+3];//用于正向输出路径
 26
 27     freopen("7084.in","r",stdin);
 28     int i,j;
 29     n=m=5;
 30     for(i=0;i<n;i++)
 31     {
 32         for(j=0;j<m;j++)
 33         {
 34             scanf("%d",&map[i][j]);
 35         }
 36     }
 37     S.xx=0;   S.yy=0;    S.index=0;//出发点在广搜过程中,放在a[]第0号位置
 38     T.xx=n-1; T.yy=m-1;  T.index=-1;
 39
 40     index=0;
 41     a[index]=S;
 42     pre[index]=-1;//广搜过程中,出发点没有前驱结点
 43     index++;
 44
 45     BFS();
 46
 47     if(T.index==-1) printf("no way!\n");
 48     else
 49     {
 50         //逆向输出路径
 51         /*for(i=index-1;pre[i]>=0;)
 52         {
 53             printf("(%d,%d)\n",a[i].xx,a[i].yy);
 54             i=pre[i];
 55         }
 56         printf("(%d,%d)\n",S.xx,S.yy);
 57         */
 58
 59         //正向输出路径
 60         j=0;
 61         for(i=index-1;pre[i]>=0;)
 62         {
 63             tt[j]=a[i];
 64             j++;
 65             i=pre[i];
 66         }
 67         printf("(%d, %d)\n",S.xx,S.yy);
 68         for(j=j-1;j>=0;j--)
 69         {
 70             printf("(%d, %d)\n",tt[j].xx,tt[j].yy);
 71         }
 72     }
 73     return 0;
 74 }
 75
 76 void BFS()
 77 {
 78     int i,txx,tyy;
 79     struct obj temp;
 80
 81     q.push(S);
 82     while(!q.empty())
 83     {
 84         for(i=0;i<4;i++)
 85         {
 86             txx=q.front().xx+dx[i];
 87             tyy=q.front().yy+dy[i];
 88             if(txx>=0&&txx<n&&tyy>=0&&tyy<m&&map[txx][tyy]==0)
 89             {
 90                 temp.xx=txx;
 91                 temp.yy=tyy;
 92                 temp.index=index;
 93                 q.push(temp);
 94                 map[txx][tyy]=1;
 95
 96                 a[index]=temp;
 97                 pre[index]=q.front().index;
 98                 index++;
 99
100                 if(temp.xx==T.xx&&temp.yy==T.yy)
101                 {
102                     T.index=temp.index;
103                     return ;
104                 }
105             }
106         }
107         q.pop();
108     }
109 }
时间: 2024-11-08 19:07:38

7084:迷宫问题的相关文章

NOI 题库 7084

7084  迷宫问题 描述 定义一个二维数组: 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的二维数组,表示一个迷宫.数据保证有唯一解. 输出 左上角到右下角的最短路径,格式如样例所示. 样例输入 0

Java小案例-(逃离迷宫)

一,迷宫需求描述: 1,用户输入迷宫图(限制方形):字母1位墙,0为通,e为出口,m为入口,*为已访问的位置,用外围1围住迷宫 2,运行轨迹右,左,下,上 3,判断该迷宫是否能从入口走到出口,并将搜索过程输出 二,迷宫实现: 1,迷宫元素类MazeCell: package smalldemo.maze; class MazeCell { public int x,y; public MazeCell(){ } public MazeCell(int x,int y){ this.x=x; th

洛谷——P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整

NYOJ306 走迷宫(dfs+二分搜索)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路

(hdu step 4.2.7)逃离迷宫(在有转弯次数的限制的情况下,判断一个点是否能到另一个点)

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

迷宫探索

/* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 */ #include<iostream> using namespace std; struct node { int x;//横坐标 int y;//纵坐标 int f;//父亲在队列中的编号 int s;//步数 }; int main() { node que[2051]; int a[51][51]={0}; int book[51][51]={0}; //定义一个用于表示走

HDU--1272 小希的迷宫

上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路).小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路.比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8.

FOJ Problem 2256 迷宫

                                                                                                                                                                           Problem 2256 迷宫 Accept: 25    Submit: 52Time Limit: 1500 mSec    Memory Limit :

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