2301_82257402 2024-06-25 08:36 采纳率: 50%
浏览 1
已结题

程序没报错,但没有任何结果,不知道怎么改


#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;
}
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 08:36
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    你的程序中有几个问题需要解决以确保能够正确输出迷宫的解路径:

    1. 打印路径函数的逻辑错误printPath 函数中,你试图打印栈中的节点,但你的打印语句没有正确地格式化输出,导致无法看到路径。你需要使用 printf 函数的格式化字符串,并且确保每个坐标后面有逗号或换行符。

    2. 回溯逻辑错误:在 solveMaze 函数的回溯部分,你试图将当前位置移动到上一个回溯点,但是你的逻辑不正确。你应该将当前节点的 data 指向回溯栈的顶部节点的 data,而不是 pathStack->topdata

    3. 迷宫访问标记问题:在 solveMaze 函数中,你使用 maze[start.x][start.y] = 2; 来标记起点已访问,但在回溯时,你将 maze[current.x][current.y] = 0; 来标记为未访问,这在深度优先搜索中是正确的,但是你需要确保在每次移动到新位置之前都更新迷宫的访问状态。

    4. 终点判断逻辑错误:在 solveMaze 函数中,你使用 if(current.x == end.x && current.y == end.x) 来判断是否到达终点,但是第二个 current.y 应该是 end.y

    5. 迷宫输入方式:你的 main 函数试图通过 scanf 从标准输入读取迷宫数据,但是你的迷宫数据已经在数组初始化时定义了,这会导致你的迷宫数据被覆盖。如果你需要从用户那里读取迷宫数据,确保不要在数组初始化时定义它们。

    6. 函数返回类型:在 solveMaze 函数中,你返回了 OKERROR,但是这两个宏定义是 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); // 移动到上一个回溯点
        }
    }
    

    请根据上述建议修改你的代码,并重新编译运行以检查结果。如果你需要进一步的帮助,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月25日
  • 已采纳回答 6月25日
  • 创建了问题 6月25日

悬赏问题

  • ¥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 有没有人知道这是哪里出了问题啊?要怎么改呀?