迷宫问题求最短路径BFS

找了好久不知道问题出在哪里了,给每个点标序号最后输出来根本没有标记到,途中还出了好多大大小小其他问题,求助大佬,实在找不出错在哪

#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