地图遍历算法一般使用深度优先搜索(DFS)或广度优先搜索(BFS)来实现。
1. 深度优先搜索
深度优先搜索可以使用递归函数实现。从起点开始,每次选择一个未被访问过的相邻节点,并沿着这个相邻节点继续向下搜索,直到找到终点或者无法继续向下搜索为止。如果无法继续向下搜索,则返回上一层,选择另一个未被访问过的相邻节点进行搜索。
以下是代码示例:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int ROW = 5; // 地图行数
const int COL = 5; // 地图列数
int map[ROW][COL] = { // 地图
{0, 0, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 1, 0, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0}
};
bool visited[ROW][COL]; // 标记是否访问过
// 判断节点是否合法
bool isValid(int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL)
return false;
if (map[x][y] == 0)
return false;
if (visited[x][y])
return false;
return true;
}
// 深度优先搜索
bool dfs(int x, int y) {
if (!isValid(x, y))
return false;
if (x == ROW - 1 && y == COL - 1) { // 到达终点
visited[x][y] = true;
return true;
}
visited[x][y] = true;
if (dfs(x + 1, y) || dfs(x, y + 1) || dfs(x - 1, y) || dfs(x, y - 1)) // 向四个方向搜索
return true;
visited[x][y] = false; // 回溯
return false;
}
int main() {
if (dfs(0, 0))
cout << "可以到达终点" << endl;
else
cout << "无法到达终点" << endl;
return 0;
}
```
2. 广度优先搜索
广度优先搜索使用队列实现。从起点开始,将起点加入队列,每次从队列中取出一个节点,并将其未被访问过的相邻节点加入队列,直到找到终点或者队列为空为止。
以下是代码示例:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int ROW = 5; // 地图行数
const int COL = 5; // 地图列数
int map[ROW][COL] = { // 地图
{0, 0, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 1, 0, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0}
};
bool visited[ROW][COL]; // 标记是否访问过
// 判断节点是否合法
bool isValid(int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL)
return false;
if (map[x][y] == 0)
return false;
if (visited[x][y])
return false;
return true;
}
// 广度优先搜索
bool bfs(int x, int y) {
queue<pair<int, int>> q;
q.push(make_pair(x, y));
visited[x][y] = true;
while (!q.empty()) {
int cx = q.front().first;
int cy = q.front().second;
q.pop();
if (cx == ROW - 1 && cy == COL - 1) // 到达终点
return true;
if (isValid(cx + 1, cy)) {
q.push(make_pair(cx + 1, cy));
visited[cx + 1][cy] = true;
}
if (isValid(cx, cy + 1)) {
q.push(make_pair(cx, cy + 1));
visited[cx][cy + 1] = true;
}
if (isValid(cx - 1, cy)) {
q.push(make_pair(cx - 1, cy));
visited[cx - 1][cy] = true;
}
if (isValid(cx, cy - 1)) {
q.push(make_pair(cx, cy - 1));
visited[cx][cy - 1] = true;
}
}
return false;
}
int main() {
if (bfs(0, 0))
cout << "可以到达终点" << endl;
else
cout << "无法到达终点" << endl;
return 0;
}
```