#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define OK 1
#define ERROR 0
typedef int Status;
//迷宫地图(0为通路,1为墙)
int maze[8][8]={
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,0,0,1,1,0,0},
{0,1,1,1,0,0,0,0},
{0,0,0,1,0,0,0,0},
{0,1,0,0,0,1,0,0},
{1,0,0,0,0,0,0,0},
};
//因为要用到坐标,所以先定义坐标的结构体(数据域)
typedef struct{
int x,y;
}Direction;
//定义链表节点的结构体(指针域)
typedef struct Node{
Direction data;
struct Node* next;
}Node;
//定义栈的结构体 将路径放入栈里
typedef struct{
Node* top;
}Stack;
//初始化
Status InitStack(Stack* stack){
stack->top=NULL;
return OK;
}
//入栈
Status Push(Stack* stack,Direction direction){
Node* newNode=(Node*)malloc(sizeof(Node)); //分配空间
newNode->data=direction;
newNode->next=stack->top; //将新结点插入栈顶
stack->top=newNode; //修改栈顶指针
return OK;
}
//出栈
Direction Pop(Stack* stack){
if(stack->top==NULL){
Direction invalidDirection={-1,-1};
return invalidDirection;} //判断是否为空栈
Node* temp=stack->top;
Direction direction=temp->data;
stack->top=temp->next;
free(temp);
return direction;
}
//检查坐标是否有效
bool isValidDirection(Direction direction){
return direction.x>=0 && direction.x<8 && direction.y>=0 && direction.y<8 && maze[direction.x][direction.y]==0;//判断该坐标的位置是否为“1”
}
//打印路径
void printPath(Stack* stack){
Node* currentNode=stack->top;
while(currentNode!=NULL){
printf(("%d,%d"),currentNode->data.x,currentNode->data.y);
currentNode=currentNode->next;
}
printf("\n");
}
//深度优先搜索
bool solveMaze(Direction start,Direction end,Stack* pathStack){
if(!isValidDirection(start)||isValidDirection(end)||maze[start.x][start.y]==1||maze[end.x][end.y]==1){
return false;
}
Stack backtrackStack; //用于回溯的栈
InitStack(&backtrackStack);
Push(pathStack,start); //将起点入栈
maze[start.x][start.y]=2; //标记起点已访问 将指定位置设置为2
while(pathStack->top!=NULL){
Direction current=pathStack->top->data;
if(current.x==end.x && current.y==end.x){
printPath(pathStack);
return OK;
}
bool foundNext=false; //尝试向四个方向移动
for(int i=0;i<4;i++){
Direction next;
switch(i){
case 0://向上移动
next.x=current.x-1;
next.y=current.y;
break;
case 1://向下移动
next.x=current.x+1;
next.y=current.y;
break;
case 2://向左移动
next.x=current.x;
next.y=current.y-1;
break;
case 3://向右移动
next.x=current.x;
next.y=current.y+1;
break;
default:
break;
}
if(isValidDirection(next) && maze[next.x][next.y]==0){
Push(&backtrackStack,next); //入栈待回溯的点
Push(pathStack,next); //入栈路径
maze[next.x][next.y]=2;
foundNext=OK;
break;
}
}
if(!foundNext){
//如果没有找到下一步可走的点,回溯到上一步
Pop(pathStack);
maze[current.x][current.y]=0; //标记为未访问
Pop(&backtrackStack);
if(backtrackStack.top!=NULL){
//如果回溯栈不为空,将当前位置移动到上一个回溯点
pathStack->top->data=backtrackStack.top->data;
}
}
}
return ERROR;
}
int main(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
scanf("%d",&maze[i][j]);
}
}
Direction start={0,0};
Direction end={7,7};
Stack pathStack;
InitStack(&pathStack);
if(solveMaze(start,end,&pathStack)){
printf("成功走出迷宫!\n");
}
else {
printf("未找到路径。\n");
}
return 0;
}
程序没报错,但没有任何结果,不知道怎么改
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 阿里嘎多学长 2024-06-25 08:36关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
你的程序中有几个问题需要解决以确保能够正确输出迷宫的解路径:
-
打印路径函数的逻辑错误:
printPath
函数中,你试图打印栈中的节点,但你的打印语句没有正确地格式化输出,导致无法看到路径。你需要使用printf
函数的格式化字符串,并且确保每个坐标后面有逗号或换行符。 -
回溯逻辑错误:在
solveMaze
函数的回溯部分,你试图将当前位置移动到上一个回溯点,但是你的逻辑不正确。你应该将当前节点的data
指向回溯栈的顶部节点的data
,而不是pathStack->top
的data
。 -
迷宫访问标记问题:在
solveMaze
函数中,你使用maze[start.x][start.y] = 2;
来标记起点已访问,但在回溯时,你将maze[current.x][current.y] = 0;
来标记为未访问,这在深度优先搜索中是正确的,但是你需要确保在每次移动到新位置之前都更新迷宫的访问状态。 -
终点判断逻辑错误:在
solveMaze
函数中,你使用if(current.x == end.x && current.y == end.x)
来判断是否到达终点,但是第二个current.y
应该是end.y
。 -
迷宫输入方式:你的
main
函数试图通过scanf
从标准输入读取迷宫数据,但是你的迷宫数据已经在数组初始化时定义了,这会导致你的迷宫数据被覆盖。如果你需要从用户那里读取迷宫数据,确保不要在数组初始化时定义它们。 -
函数返回类型:在
solveMaze
函数中,你返回了OK
和ERROR
,但是这两个宏定义是int
类型,而你的函数签名返回的是bool
类型。你需要确保函数的返回类型与宏定义的类型一致。
下面是修改后的
printPath
函数和solveMaze
函数的相关部分:// 打印路径 void printPath(Stack* stack){ Node* currentNode = stack->top; while (currentNode != NULL) { printf("(%d,%d) ", currentNode->data.x, currentNode->data.y); currentNode = currentNode->next; } printf("\n"); } // 深度优先搜索中的回溯逻辑 if (!foundNext) { Direction lastDirection = Pop(&backtrackStack); // 取出待回溯的点 maze[current.x][current.y] = 0; // 标记为未访问 if (backtrackStack.top != NULL) { current = Pop(&backtrackStack); // 移动到上一个回溯点 } }
请根据上述建议修改你的代码,并重新编译运行以检查结果。如果你需要进一步的帮助,请随时提问。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录 -
悬赏问题
- ¥15 Linux环境下CA证书更新问题
- ¥60 微信小程序如何上传QQ聊天文件
- ¥300 开发的系统遭到无良商家的破解,请问如何防止再次发生,并追回损失
- ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
- ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
- ¥15 PPOCRLabel
- ¥15 混合键合键合机对准标识
- ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
- ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
- ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?