c++ 迷宫搜索【队列 搜索 BFS】宽搜优先搜索

问题 C: 迷宫搜索【队列 搜索 BFS】
题目描述: 
迷宫的游戏,相信大家都听过,现在我们用一个n*m的矩阵表示一个迷宫,例如:

S.X.
..X.
..XD
....

其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。

      你的任务是判断在x步内(小于等于x),能否从起点走到终点。

输入格式
第一行输入三个数n m x,分别表示迷宫的尺寸和步数。(1 < n,m < 7; 0 < x < 50)

接下来输入一个n*m的矩阵,描述迷宫的状态。
输出格式
判断是否能在x步内从起点走到终点,如果可以,输出“YES”,否则输出“NO”。

输入样例 
3 4 5
S.X.
..X.
...D
输出样例 
YES */ 

#include <bits/stdc++.h>
using namespace std;
int n, m, z, f, e;//e是入队的下标 f 是出队的下标
struct point //结构体

    int x, y, step; // 定义变量 x, y, step. 其中 x, y, 表示 char g[10][10], 里的查找 数据位置。 step 就是步数。 
};
int dx[4] = {1, -1, 0, 0};//dx[] + dy[] 代表小人走的4个方向可达的点 
int dy[4] &

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
下面是一个简单的 C++ 实现,使用广度优先搜索算法来解决迷宫问题。 ```cpp #include <iostream> #include <queue> using namespace std; const int MAX_N = 100; // 迷宫的最大行数和列数 int n, m; // 迷宫的行数和列数 char maze[MAX_N][MAX_N + 1]; // 表示迷宫的字符数组 int sx, sy; // 起点坐标 int gx, gy; // 终点坐标 int d[MAX_N][MAX_N]; // 到起点的最短距离的数组 // 移动的四个方向(上、右、下、左) int dx[4] = { -1, 0, 1, 0 }; int dy[4] = { 0, 1, 0, -1 }; // 求从起点到终点的最短距离 int bfs() { queue<pair<int, int>> q; // 初始化 d 数组为 -1(表示未到达过该点) for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { d[i][j] = -1; } } // 把起点加入队列,并初始化到起点的最短距离为 0 q.push(make_pair(sx, sy)); d[sx][sy] = 0; while (!q.empty()) { pair<int, int> p = q.front(); q.pop(); // 如果已到达终点,则结束搜索 if (p.first == gx && p.second == gy) { break; } // 移动四个方向 for (int i = 0; i < 4; i++) { int nx = p.first + dx[i]; int ny = p.second + dy[i]; // 如果移动后到达的位置是空地且未到达过(d[nx][ny]=-1),则加入队列,并更新到该位置的最短距离 if (0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' && d[nx][ny] == -1) { q.push(make_pair(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } } // 返回从起点到终点的最短距离 return d[gx][gy]; } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { cin >> maze[i]; } // 在迷宫中寻找起点和终点 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (maze[i][j] == 'S') { sx = i; sy = j; } if (maze[i][j] == 'G') { gx = i; gy = j; } } } cout << bfs() << endl; // 输出从起点到终点的最短距离 return 0; } ``` 以上是一个简单的广度优先搜索解决迷宫问题的 C++ 实现,可以根据需要进行修改和优化。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值