找了好久不知道问题出在哪里了,给每个点标序号最后输出来根本没有标记到,途中还出了好多大大小小其他问题,求助大佬,实在找不出错在哪
#include<iostream>
using namespace std;
typedef struct Data {
int visited = 0; //是否检索过
int order = 0; //序号
int pass = 0; //是否可以通过
int x = 0; //x坐标
int y = 0; //y坐标
}Data;
typedef struct Node {
Data data;
Node* next = NULL;
}*Block;
typedef struct LinkQ {
Block front;
Block rear;
}*Link;
void InitQueue(LinkQ* Q) {
Q->front = Q->rear = (Block)malloc(sizeof(struct Node));
Q->front->next = NULL;
}
void EnQueue(LinkQ* Q, Node n) {
Block p = (Block)malloc(sizeof(struct Node));
p->data = n.data;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
void DeQueue(LinkQ* Q, Data d) {
if (Q->front != Q->rear) {
Block p = Q->front->next;
d = p->data;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front;
free(p);
}
}
void NewMaze(int length, int width, Node maze[][17]) {
int p;
cout << "请按行一次输入地图:" << endl;
for (int i = 1; i <= length; i++) //行数
for (int j = 1; j <= width; j++) { //列数
cin >> p;
maze[i][j].data.x = i;
maze[i][j].data.y = j;
maze[i][j].data.pass = p;
}
}
void MarkMaze(int sx, int sy, int ex, int ey, Node maze[][17]) {
Link q = (Link)malloc(sizeof(LinkQ));
Data d;
InitQueue(q);
EnQueue(q, maze[sx][sy]);
while (q->front->next != NULL) {
DeQueue(q, d);
if (maze[d.x + 1][d.y].data.pass == 1 && maze[d.x + 1][d.y].data.visited == 0) {
EnQueue(q, maze[d.x + 1][d.y]);
maze[d.x + 1][d.y].data.visited++;
maze[d.x + 1][d.y].data.order = d.order + 1;
}
if (maze[d.x - 1][d.y].data.pass == 1 && maze[d.x - 1][d.y].data.visited == 0) {
EnQueue(q, maze[d.x - 1][d.y]);
maze[d.x - 1][d.y].data.visited++;
maze[d.x - 1][d.y].data.order = d.order + 1;
}
if (maze[d.x][d.y + 1].data.pass == 1 && maze[d.x][d.y + 1].data.visited == 0) {
EnQueue(q, maze[d.x][d.y + 1]);
maze[d.x][d.y + 1].data.visited++;
maze[d.x][d.y + 1].data.order = d.order + 1;
}
if (maze[d.x][d.y - 1].data.pass == 1 && maze[d.x][d.y - 1].data.visited == 0) {
EnQueue(q, maze[d.x][d.y - 1]);
maze[d.x][d.y - 1].data.visited++;
maze[d.x][d.y - 1].data.order = d.order + 1;
}
}
}
void FindPath(int sx, int sy, int ex, int ey, Node maze[][17]) {
maze[ex][ey].data.pass = 4;
while (ex != sx && ey != sy) {
if (maze[ex + 1][ey].data.order == maze[ex][ey].data.order - 1)
maze[++ex][ey].data.pass = 3;
else if (maze[ex - 1][ey].data.order == maze[ex][ey].data.order - 1)
maze[--ex][ey].data.pass = 3;
else if (maze[ex][ey + 1].data.order == maze[ex][ey].data.order - 1)
maze[ex][++ey].data.pass = 3;
else if (maze[ex][ey - 1].data.order == maze[ex][ey].data.order - 1)
maze[ex][--ey].data.pass = 3;
}
maze[sx][sy].data.pass = 2;
}
void PrintPath(int length, int width, Node maze[][17]) {
cout << "请确认迷宫读入正确!" << endl;
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= width; j++)
cout << maze[i][j].data.pass << " ";
cout << endl;
}
cout << endl;
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= width; j++)
cout << maze[i][j].data.order << " ";
cout << endl;
}
}
int main() {
int length, width;
int startX, startY, endX, endY;
Node maze[17][17];
cout << "请输入迷宫的长度和宽度:";
cin >> length >> width;
cout << "请输入起点:";
cin >> startX >> startY;
cout << "请输入出口:";
cin >> endX >> endY;
NewMaze(length, width, maze);
MarkMaze(startX, startY, endX, endY, maze);
//FindPath(startX, startY, endX, endY, maze);
PrintPath(length, width, maze);
return 0;
}
BFS(Breadth-First Search)算法的具体实现就是:通过不断取得某个状态能够达到的所有状态并将其加入队列尾, 并且由于队列本身的特性先加入队列的状态总是先得到处理,这样就可以总是先将需要转移次数更少的状态进行处理。换句话说就是总是取得了这个状态的树中更接近根部的节点,又或者是总是让搜索树的广度得到尽可能增加。拿一个例子来说,有一个如图所示的迷宫,'#' 为墙壁,'.' 为道路,'S' 为起点,'G' 为终点,需要我们找出从起点到达终点的最短路径。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632