「已注销」 2014-12-05 09:29 采纳率: 0%
浏览 2354

关于队列迷宫的一个问题

一个关于队列求解迷宫的小问题,发现把主函数里设置的出口坐标改动的时候会出现运行错误,比如说改成(1,1,8,1)就会有错。。。实在是有点看不懂了,发帖求教前辈们出手帮忙看看问题出在哪,要怎么改啊???编译软件codeblocks

/*

  • 迷宫求解 * */ #include #include #define MAXSIZE 1000 #define M 10 int mg[M][M] = { // 此迷宫有三条路径 {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,1,1,1,1,1}, {1,0,1,0,0,0,0,1,1,1}, {1,0,0,1,1,1,0,1,1,1}, {1,1,0,1,1,1,0,0,0,1}, {1,1,0,1,1,1,1,1,0,1}, {1,0,0,0,0,0,1,1,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} };

// ------------------ 栈定义 -------------------------
struct{
int i,j; // 方块的位置
int pre; // 本路径中上一方块在路径中的下标
}Qu[MAXSIZE];

void print(int front);
/*

  • 利用队列求解迷宫
    */
    void mgpath(int x1, int y1, int x2, int y2)
    {
    int front,rear;
    int find =0;
    int i,j;
    int di;
    front=-1;
    rear=-1;

    rear++; // (x1,y1)入队
    Qu[rear].i = x1;
    Qu[rear].j = y1;
    Qu[rear].pre = -1;

    mg[x1][y1]=-1; // 置为-1, 以免重复搜索
    while(front<=rear && !find)
    {
    front++; // 出队
    i = Qu[front].i;
    j = Qu[front].j;
    if(i == x2 && j == y2) // 出口
    {
    find = 1;
    print(front);
    return;
    }

    for(di=0;di<3;di++)
    {
        switch(di)
        {
            case 0:
                i=Qu[front].i - 1;
                j=Qu[front].j;
            break;
            case 1:
                i=Qu[front].i;
                j=Qu[front].j+1;
            break;
            case 2:
                i=Qu[front].i + 1;
                j=Qu[front].j;
            break;
            case 3:
                i=Qu[front].i;
                j=Qu[front].j - 1;
            break;
        }
        if(mg[i][j] == 0) // 找到
        {
            rear++; // 插入
            Qu[rear].i = i;
            Qu[rear].j = j;
            Qu[rear].pre = front;
            mg[i][j] = -1;
        } // if
    } // for
    

    } // while
    if(!find)
    printf("找不到可走路径");
    }

void print(int front)
{
int f,t;
int ns=0;
f=front;
printf("\n");
do{
t = f;

    f = Qu[f].pre;
    Qu[t].pre = -1; //把当前的设为 -1
}while(f!=0);
printf("路径如下:\n");
f=0;
while(f<MAXSIZE)
{
    if(Qu[f].pre==-1)
    {
        ns++;
        printf("(%d,%d)  ",Qu[f].i,Qu[f].j);
        if(ns%5 == 0)
            printf("\n");
    }
    f++;
}

}
void main()
{
int i,j;
printf("迷宫设置如下:\n\n");
for(i = 0; i < M; i++)
{
for(j = 0; j < M; j++)
{
printf("%d ",mg[i][j]);
}
printf("\n");
}
mgpath(1,1,8,8);
}

  • 写回答

1条回答

  • Coursera 2014-12-05 17:05
    关注

    我没有仔细看代码,但是循环部分没有检查边界(最上,最下,最左,最右)。明显是个bug

    评论

报告相同问题?

悬赏问题

  • ¥20 怎么在stm32门禁成品上增加记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 解riccati方程组