经典算法:蚂蚁走迷宫(二)
蚂蚁走迷宫之代码实现
代码实现
变量定义
// 方向向量
const int direction[4][2] = {{0, 1},
{-1, 0},
{0, -1},
{1, 0}};
const int MAXM = 100, MAXN = 100, QUEUE_LENGTH = 5;
// 队列中的节点
struct Node {
int x, y, distance;
Node() {}
Node(int xx, int yy, int d) : x(xx), y(yy), distance(d) {}
};
int n, m, step = 0, map[MAXM][MAXN], visit[MAXM][MAXN];
Node start, target;BFS标准模板
void bfs() {
Node queue[QUEUE_LENGTH];
int head = 0, tail = 1;
queue[0] = Node(start.x, start.y, 0);
visit[start.x][start.y] = 0;
while (head != tail) {
int x = queue[head].x;
int y = queue[head].y;
int distance = queue[head].distance;
head = (head + 1) % QUEUE_LENGTH;
for (int i = 0; i < 4; ++i) {
int dx = x + direction[i][0];
int dy = y + direction[i][1];
if (dx >= 0 && dx < m && dy >= 0 && dy < n && visit[dx][dy] == -1 && map[dx][dy] >= 0) {
// 表示从i方向走过来的,方便后续回溯路径
visit[dx][dy] = i;
if (dx == target.x && dy == target.y) {
cout << "已到目标点,最短距离为" << distance + 1 << endl;
step = distance + 1;
return;
}
if ((tail + 1) % QUEUE_LENGTH == head) {
cout << "队列满" << endl;
return;
}
// 新坐标入队
queue[tail] = Node(dx, dy, distance + 1);
tail = (tail + 1) % (QUEUE_LENGTH);
}
}
}
}路径回溯
void printPath() {
int x, y, d, path[MAXM][MAXN] = {0};
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
path[i][j] = -1;
}
}
x = target.x;
y = target.y;
path[start.x][start.y] = 0;
// 路径回溯
while (!(x == start.x && y == start.y)) {
path[x][y] = step--;
d = visit[x][y];
x -= direction[d][0];
y -= direction[d][1];
}
// 路径打印
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (path[i][j] >= 0) {
cout << path[i][j];
} else {
cout << "-";
}
}
cout << endl;
}
}数据输入
int main() {
cin >> m >> n;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> map[i][j];
visit[i][j] = -1;
}
}
cin >> start.x >> start.y >> target.x >> target.y;
bfs();
if (step > 0) printPath();
return 0;
}测试结果
输入数据: 5 5 0 0 -1 0 0 0 0 0 0 -2 -1 0 -2 0 0 0 0 0 -1 0 0 -2 0 0 0 1 1 4 3 输出: 已到目标点,最短距离为5 路径打印: ----- -0--- -1--- -23-- --45-
除特别注明外,本站所有文章均为技术藤原创,转载请注明出处来自https://www.jishuteng.com/article/3.html
分享到微信朋友圈
扫一扫,手机阅读
支付宝打赏
微信打赏

参与评论 0条评论