广度优先算法:迷宫问题

广度优先算法:

模拟队列:数据量较小,需要打印路径坐标

STL队列:数据量较大,只需要打印步数

迷宫问题

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)

 1 #include <stdio.h>
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 const int MAX = 5;
 7 const int x[] = { -1, 0, 1, 0 };
 8 const int y[] = { 0, 1, 0, -1 };
 9
10 struct point
11 {
12     int x, y, pre;
13     point(){};
14     point(int _x, int _y, int _pre) : x(_x), y(_y), pre(_pre){};
15 };
16
17 point que[MAX * MAX];
18 int arr[MAX][MAX];
19 bool vis[MAX][MAX];
20
21 void BFS();
22 void Print(int n);
23
24 int main()
25 {
26 #ifdef OFFLINE
27     freopen("input.txt", "r", stdin);
28     freopen("output.txt", "w", stdout);
29 #endif
30
31     memset(que, 0, sizeof(que));
32     memset(arr, 0, sizeof(arr));
33     memset(vis, 0, sizeof(vis));
34
35     for (int i = 0; i < MAX; i++)
36     {
37         for (int j = 0; j < MAX; j++)
38         {
39             scanf("%d", &arr[i][j]);
40         }
41     }
42
43     BFS();
44
45     return 0;
46 }
47
48 void BFS()
49 {
50     int qh = 0, qt = 0;
51     que[qt++] = point(0, 0, -1);
52     vis[0][0] = true;
53
54     while (qh < qt)
55     {
56         if (que[qh].x == 4 && que[qh].y == 4)
57         {
58             Print(qh);
59             return;
60         }
61
62         for (int i = 0; i < 4; i++)
63         {
64             int nx = que[qh].x + x[i], ny = que[qh].y + y[i], npre = qh;
65             if (nx >= 0 && nx < MAX && ny >= 0 && ny < MAX && !arr[nx][ny] && !vis[nx][ny])
66             {
67                 que[qt++] = point(nx, ny, npre);
68                 vis[nx][ny] = true;
69             }
70         }
71
72         qh++;
73     }
74
75     return;
76 }
77
78 void Print(int n)
79 {
80     if (n == -1) return;
81     Print(que[n].pre);
82     printf("(%d, %d)\n", que[n].x, que[n].y);
83 }

时间: 2024-10-11 07:50:25

广度优先算法:迷宫问题的相关文章

golang 实现广度优先算法(走迷宫)

maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ func readMaze(filename string) [][]int { file, err := os.Open(filename) if err != nil { panic(err) } var cols, rows int fmt.Fscanf(file, "%d %d", &a

编程算法 - 迷宫的最短路径 代码(C++)

迷宫的最短路径 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个大小为N*M的迷宫. 迷宫由通道和墙壁组成, 每一步可以向邻接的上下左右四格的通道移动. 请求出从起点到终点所需的最小步数. 请注意, 本题假定从起点一定可以移动到终点. 使用宽度优先搜索算法(DFS), 依次遍历迷宫的四个方向, 当有可以走且未走过的方向时, 移动并且步数加一. 时间复杂度取决于迷宫的状态数, O(4*M*N)=O(M*N). 代码: /* * m

BFS广度优先算法的思路

广度优先算法的思想是 对所有的Node进行遍历 然后将第一个Node入队列 设置其visited为真 然后 对第一个Node跟其它剩余的Node进行遍历对比 找出连通的Node 并将其visited属性赋值为真 然后将其入队列 接下来对队列里面的Node进行迭代处理 最终完全遍历所有节点

【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.广度优先搜索让你能够找出两样东西之间最短的距离.在学习这个算法之前我们要了解图的概念 1.什么是图 如上图所示.图是有节点和边组成的.一个节点可能和很多节点直接相连,这些相

深度优先算法和广度优先算法

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

树图 广度优先算法和深度优先算法

原文链接: ????????深度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098342257387/ ????????广度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098711040303/ 树图 广度优先算法和深度优先算法

深度优先与广度优先算法

图的遍历有深度优先和广度优先算法. 深度优先遍历可描述为一个递归算法.当到达顶点v时,具体操作是: ①访问(v); ②for(与v相邻的每个顶点w) 遍历(w): //深度优先算法 template<int max_size> void Diagraph<max_size>::depth_first(void(*visit)(Vertex &)) const { bool visited[max_size]; //引入数组防止无限循环 Vertex v; for (all

C语言之广度优先算法

广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标节点(节点就是那些圆球球,其中有一个或者多个是目标节点)或者搜完了整个图都没找到目标节点就停止搜索. 实现这个要是想用像深度优先算法那样函数套函数那样是难以实现的(至少我实现不了). 像这样的: 求问从A到B的最短路径的节点数是多少? 这道题很简单嘛,肯定是A-C-B啊,答案是3啊.那怎样用C语言实现呢? 深搜的话:一条路一条路读取,取节点数最小的,也可以,但是问题来了,当节点数特别多,图非常“辽阔

C程序设计的抽象思维-回溯算法-迷宫问题

[迷宫问题] 两种方法:1. 堆栈回溯,2.递归回溯. [算法1---堆栈回溯] 计算机解迷宫时,通常用的是"试探和回溯"的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走:否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止,如果所有可能的通路都试探过,还是不能走到终点,那就说明该迷宫不存在从起点到终点的通道. 1.从入口进入迷宫之后,不管在迷宫的哪一个位置上,都是先往东走,如果走得通就继续往东走,如果在某个位置上往东走不通的话,就依次试探往南.往西和往