本人在学习C语言,对c++一窍不通,希望帮忙
以下是代码(实现bfs迷宫自动寻路,希望改动尽量少)
#include <bits/stdc++.h>
using namespace std;
struct que
{
int x, y, s, f;
} node[250];
int main()
{
int fill[50][50], book[50][50];
memset(book, 0, sizeof(book));
int m, n; // m->x n->y
int start_x, start_y, finish_x, finish_y;
int head = 1, tail = 1;
int tx, ty; //下一步的位置坐标
bool flag = false; //用于结束双层循环
//初始化迷宫地图
cin >> m >> n;
for (int y = 0; y < n; y++)
for (int x = 0; x < m; x++)
cin >> fill[y][x];
cin >> start_x >> start_y >> finish_x >> finish_y;
//初始化迷宫入口
book[start_y][start_x] = 1;
node[tail].x = start_x;
node[tail].y = start_y;
node[tail].f = 0;
node[tail].s = 0;
tail++;
//寻路
while (head < tail)
{
for (int ctrl = 0; ctrl < 4; ctrl++) //控制下一步行走方向
{
switch (ctrl)
{
case 0: //向右走
tx = node[head].x + 1;
ty = node[head].y;
break;
case 1: //向下走
tx = node[head].x;
ty = node[head].y + 1;
break;
case 2: //向左走
tx = node[head].x - 1;
ty = node[head].y;
break;
case 3: //向上走
tx = node[head].x;
ty = node[head].y - 1;
break;
}
if (tx < 0 || tx > m - 1 || ty < 0 || ty > n - 1)
continue; //如果撞了围墙就返回
if (fill[ty][tx] == 0 && book[ty][tx] == 0)
{
node[tail].s = node[head].s + 1;
node[tail].x = tx;
node[tail].y = ty;
node[tail].f = head;
book[ty][tx] = 1;
tail++;
} //如果下一步没有撞墙,并且没有走过这个地方
if (ty == finish_x && ty == finish_y)
{
flag = true;
break; //如果走到终点,停止行走
}
}
if (flag)
break; //flag的妙用[手动滑稽]
head++;
}
cout << node[tail - 1].s << endl; //打印出从起点走了多少步到终点
//倒序输出所经过的位置的坐标
cout << finish_x << finish_y << endl;
int temp = node[tail - 1].f;
while (temp != 0)
{
cout << node[temp].x << node[temp].y << endl;
fill[node[temp].y][node[temp].x] = 2;
temp = node[temp].f;
}
fill[finish_y][finish_x] = 2;
for (int y = 0; y < n; y++)
{
for (int x = 0; x < m; x++)
cout << fill[y][x] << " ";
cout << endl;
}
system("pause");
return 0;
}
TechWhizKid参考GPT回答:
#include <stdio.h>
#include <stdlib.h>
struct que
{
int x, y, s, f;
} node[250];
int main()
{
int fill[50][50], book[50][50];
int i, j;
for(i=0; i<50; i++)
for(j=0; j<50; j++)
book[i][j] = 0;
int m, n; // m->x n->y
int start_x, start_y, finish_x, finish_y;
int head = 1, tail = 1;
int tx, ty; //下一步的位置坐标
int flag = 0; //用于结束双层循环
//初始化迷宫地图
scanf("%d %d", &m, &n);
for (int y = 0; y < n; y++)
for (int x = 0; x < m; x++)
scanf("%d", &fill[y][x]);
scanf("%d %d %d %d", &start_x, &start_y, &finish_x, &finish_y);
//初始化迷宫入口
book[start_y][start_x] = 1;
node[tail].x = start_x;
node[tail].y = start_y;
node[tail].f = 0;
node[tail].s = 0;
tail++;
//寻路
while (head < tail)
{
for (int ctrl = 0; ctrl < 4; ctrl++) //控制下一步行走方向
{
switch (ctrl)
{
case 0: //向右走
tx = node[head].x + 1;
ty = node[head].y;
break;
case 1: //向下走
tx = node[head].x;
ty = node[head].y + 1;
break;
case 2: //向左走
tx = node[head].x - 1;
ty = node[head].y;
break;
case 3: //向上走
tx = node[head].x;
ty = node[head].y - 1;
break;
}
if (tx < 0 || tx > m - 1 || ty < 0 || ty > n - 1)
continue; //如果撞了围墙就返回
if (fill[ty][tx] == 0 && book[ty][tx] == 0)
{
node[tail].s = node[head].s + 1;
node[tail].x = tx;
node[tail].y = ty;
node[tail].f = head;
book[ty][tx] = 1;
tail++;
} //如果下一步没有撞墙,并且没有走过这个地方
if (ty == finish_x && ty == finish_y)
{
flag = 1;
break; //如果走到终点,停止行走
}
}
if (flag)
break; //flag的妙用[手动滑稽]
head++;
}
printf("%d\n", node[tail - 1].s); //打印出从起点走了多少步到终点
//倒序输出所经过的位置的坐标
printf("%d %d\n", finish_x, finish_y);
int temp = node[tail - 1].f;
while (temp != 0)
{
printf("%d %d\n", node[temp].x, node[temp].y);
fill[node[temp].y][node[temp].x] = 2;
temp = node[temp].f;
}
fill[finish_y][finish_x] = 2;
for (int y = 0; y < n; y++)
{
for (int x = 0; x < m; x++)
printf("%d ", fill[y][x]);
printf("\n");
}
system("pause");
return 0;
}
#include <stdio.h>
#include <math.h>
#include <time.h>
#define SIZE 39000
#define QUE_SIZE 55185
//左上右下四个方向
int dir[4][2] = { {0,-1},{-1,0},{0,1},{1,0} };
//记录位置信息和步数
struct point {
unsigned int x;
unsigned int y;
int step;
};
struct point que[QUE_SIZE];
int head = 0, rear = 0;
int BFS_Opt(char map[SIZE][SIZE])
{
//初始位置(0,0)进队列
que[head].x = 0;
que[head].y = 0;
que[head].step = 1;
//进队列 +2 表示位置(0,0)已经访问过了
map[0][0] +=2;
head++;
while (rear != head)
{
// 出队列一个数据
struct point temp;
temp.x = que[rear].x;
temp.y = que[rear].y;
temp.step = que[rear].step;
if (temp.x == SIZE - 1 && temp.y == SIZE - 1)
return temp.step;
//循环队列
rear = (rear + 1) % QUE_SIZE;
for (int i = 0; i < 4; i++) {
int x = temp.x + dir[i][0];
int y = temp.y + dir[i][1];
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || map[x][y] >= 2)
continue;
if ( map[x][y]) == 1)
{
//满足条件,这个数据进队列
que[head].x = x;
que[head].y = y;
que[head].step = temp.step + 1;
//进队列的这个位置数据 +2 表示访问过
map[x][y] +=2;
//循环队列
head = (head + 1) % QUE_SIZE;
}
}
}
return 0;
}
这段代码,把cin当成scanf,cout当成printf就行了
对其进行了一些修改以使其能够在C++中正确运行:回答申明:包含AI辅助答案参考ChatGPT Plus版
将#include <bits/stdc++.h>更改为具体的标准库头文件包含,例如#include 和#include 。
将结构体定义struct que移动到main函数内部,并使用que作为结构体类型。
在打印最终结果时,将输出坐标的格式从cout << finish_x << finish_y << endl;修改为cout << finish_x << " " << finish_y << endl;。
将输出迷宫地图时,每个数字之间添加空格,以提高可读性。
#include <iostream>
#include <cstring>
using namespace std;
struct que {
int x, y, s, f;
};
int main() {
int fill[50][50], book[50][50];
memset(book, 0, sizeof(book));
int m, n; // m->x n->y
int start_x, start_y, finish_x, finish_y;
int head = 1, tail = 1;
int tx, ty; //下一步的位置坐标
bool flag = false; //用于结束双层循环
//初始化迷宫地图
cin >> m >> n;
for (int y = 0; y < n; y++)
for (int x = 0; x < m; x++)
cin >> fill[y][x];
cin >> start_x >> start_y >> finish_x >> finish_y;
//初始化迷宫入口
book[start_y][start_x] = 1;
que node[250];
node[tail].x = start_x;
node[tail].y = start_y;
node[tail].f = 0;
node[tail].s = 0;
tail++;
//寻路
while (head < tail) {
for (int ctrl = 0; ctrl < 4; ctrl++) { //控制下一步行走方向
switch (ctrl) {
case 0: //向右走
tx = node[head].x + 1;
ty = node[head].y;
break;
case 1: //向下走
tx = node[head].x;
ty = node[head].y + 1;
break;
case 2: //向左走
tx = node[head].x - 1;
ty = node[head].y;
break;
case 3: //向上走
tx = node[head].x;
ty = node[head].y - 1;
break;
}
if (tx < 0 || tx > m - 1 || ty < 0 || ty > n - 1)
continue; //如果撞了围墙就返回
if (fill[ty][tx] == 0 && book[ty][tx] == 0) {
node[tail].s = node[head].s + 1;
node[tail].x = tx;
node[tail].y = ty;
node[tail].f = head;
book[ty][tx] = 1;
tail++;
} //如果下一步没有撞墙,并且没有走过这个地方
if (ty == finish_x && ty == finish_y) {
flag = true;
break; //如果走到终点,停止行走
}
}
if (flag)
break; //flag的妙用[手动滑稽]
head++;
}
cout << node[tail - 1].s << endl; //打印出从起点走了多少步到终点
//倒序输出所经过的位置的坐标
cout << finish_x << " " << finish_y << endl;
int temp = node[tail - 1].f;
while (temp != 0) {
cout << node[temp].x << " " << node[temp].y << endl;
fill[node[temp].y][node[temp].x] = 2;
temp = node[temp].f;
}
fill[finish_y][finish_x] = 2;
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++)
cout << fill[y][x] << " ";
cout << endl;
}
system("pause");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct Node {
int x, y; // 位置坐标
int step; // 步数
int father; // 父节点序号
};
int main() {
int maze[50][50];
bool visited[50][50] = {false};
int m, n; // 迷宫行列数
int sx, sy, ex, ey; // 起点和终点坐标
cin >> m >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> maze[i][j];
}
}
cin >> sx >> sy >> ex >> ey;
queue<Node> q;
// 起点入队
q.push({sx, sy, 0, -1});
visited[sy][sx] = true;
while (!q.empty()) {
Node cur = q.front();
q.pop();
// 找到终点,输出结果并退出
if (cur.x == ex && cur.y == ey) {
cout << cur.step << endl;
int tmp = cur.father;
while (tmp != -1) {
cout << maze[q[tmp].y][q[tmp].x] << endl;
maze[q[tmp].y][q[tmp].x] = 2; // 标记路径
tmp = q[tmp].father;
}
maze[ey][ex] = 2; // 标记终点
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << maze[i][j] << " ";
cout << endl;
}
return 0;
}
// 向四个方向扩散
if (cur.x + 1 < m && maze[cur.y][cur.x + 1] == 0 && !visited[cur.y][cur.x + 1]) {
q.push({cur.x + 1, cur.y, cur.step + 1, cur.x});
visited[cur.y][cur.x + 1] = true;
}
if (cur.x - 1 >= 0 && maze[cur.y][cur.x - 1] == 0 && !visited[cur.y][cur.x - 1]) {
q.push({cur.x - 1, cur.y, cur.step + 1, cur.x});
visited[cur.y][cur.x - 1] = true;
}
if (cur.y + 1 < n && maze[cur.y + 1][cur.x] == 0 && !visited[cur.y + 1][cur.x]) {
q.push({cur.x, cur.y + 1, cur.step + 1, cur.y});
visited[cur.y + 1][cur.x] = true;
}
if (cur.y - 1 >= 0 && maze[cur.y - 1][cur.x] == 0 && !visited[cur.y - 1][cur.x]) {
q.push({cur.x, cur.y - 1, cur.step + 1, cur.y});
visited[cur.y - 1][cur.x] = true;
}
}
cout << "No path!" << endl;
}
这个C++版本代码作了以下改动:
queue
代替数组实现队列,更加简洁。Node
表示队列中的节点,包含位置、步数和父节点信息。望采纳!