c语言队列解决迷宫问题

问题遇到的现象和发生背景

发不了问题只能发图片了

img

我的FindWay这个迷宫函数有问题while循环里的for循环有问题,但是我不知道哪里出错了,程序运行完,总是显示无法找到出口

用代码块功能插入代码,请勿粘贴截图
#include 
#include 
#include 
//数据类型
#define ElemType int
//队列的最大空间
#define MAXSIZE 800
#define M 10
#define N 10


//队列的管理结构
typedef struct Queue
{
    int       base1[MAXSIZE];//指向队列空间的基址
    int       base2[MAXSIZE];
    int       base3[MAXSIZE];
    int       front; //头指针
    int       rear; //尾指针
}Queue;

//队列初始化
void InitQueue(Queue *Q)
{
    //初始时队列为空,头指针和尾指针都指向0位置
    Q->front = Q->rear = 0;
}
//入队操作
void EnQueue(Queue *Q, ElemType x,ElemType y,ElemType k)
{
    //判断循环队列是否已满
    if(((Q->rear+1)%MAXSIZE) == Q->front)
        return;
    //队列未满,将数据入队
    Q->base1[Q->front] = x;
    Q->base2[Q->front] = y;
    Q->base3[Q->front] = k;
    //更改尾指针的指向
    Q->rear = (Q->rear+1)%MAXSIZE;
}
//出队操作
void DeQueue(Queue *Q,int *x,int *y)
{
    //判断循环队列是否为空
    if(Q->front == Q->rear)
        return;
    //如果非空,实现可循环出队
    *x=Q->base1[Q->front];
    *y=Q->base2[Q->front];
    Q->front = (Q->front+1)%MAXSIZE;
}
//打印循环队列中的数据
void ShowQueue(Queue *Q)
{
    //遍历循环队列中的元素,并将数据打印
    for(int i=Q->front; i!=Q->rear;)
    {
        printf("%d %d %d\n",Q->base1[i],Q->base2[i],Q->base3[i]);
        //此操作是为了实现循环遍历
        i = (i+1)%MAXSIZE;
    }
    printf("\n");
}
//获取队头元素
void GetHdad(Queue *Q, ElemType *x,ElemType *y,ElemType *k)
{
    //判断循环队列是否为空
    if(Q->front == Q->rear)
        return;
    //如果队列不为空,获取队头元素
    *x = Q->base1[Q->front];
    *y = Q->base2[Q->front];
    *k = Q->base3[Q->front];
}
//获取队列长度(元素个数)
int Length(Queue *Q)
{
    //计算尾指针位置与头指针位置的差距
    int len= Q->rear - Q->front;
    //如果为正数,那么len就是队列的长度;如果为负数,那么MAXSIZE+len才是队列的长度
    len = (len>0) ? len : MAXSIZE+len;
    return len;
}
//清空队列
void ClearQueue(Queue *Q)
{
    //将队头指针和队尾指针都置为0
    Q->front = Q->rear = 0;
}

//
// map 迷宫地图
// mark 标记数组
//迷宫地图进行初始化,迷宫最外圈为 1,作为边界,其中的路径随机生成,(1,1)为入口,(M,N)为出口
void creatMap(int map[M+2][N + 2],int mark[M+2][N + 2]){
    static unsigned int seed = 0;
    seed++;
    srand((unsigned) time(NULL) + seed * seed);
    for (int i = 0; i < M + 2 ; ++i) {
        for (int j = 0; j < N + 2; ++j) {
            if(i == 0 || i == M + 1 || j == 0 || j == N + 1 ){
                map[i][j] = 1;
            }
            else{
                map[i][j] = rand() % 2;              //
            }
            mark[i][j] = 0;
        }
    }
    map[1][1] = 0;
    map[M][N] = 0;
}

void shuzuprint(int map[M+2][N + 2]){
    for(int i=0;i2;i++){
        for(int j=0;j2;j++){
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}


//map 迷宫地图——二维数组
//mark 标记数组
//xi yi 入口坐标
// xe ye 出口坐标
//从入口开始,扫描它周围的八个点,将可通的点入队

int FindWay(int xi, int yi, int xe, int ye,int map[][N + 2],int mark[][N + 2]){
    int i, j, di;
    int Direction[8][2]={0,-1,         //八个方向对应的位置
                         -1,-1,
                         -1,0,
                         -1,1,
                         0,1,
                         1,1,
                         1,0,
                         1,-1};
    Queue Q;
    InitQueue(&Q);
//    sanyuanzu q = {xi,yi,-1};    //将入口的前驱下标置为-1,在打印路径时会用到
    EnQueue(&Q, xi,yi,-1);        //入口结点入队
    mark[xi][yi] = 1;
    while(Q.front!=Q.rear){
        DeQueue(&Q, &i, &j);//队首元素出队,i,j 为其坐标(变参)
        if (i == xe && j == ye){
//            print(sqQueue, sqQueue->front,mark,map);
//            return 1;
            printf("行");
            return 1;
        }
        for (int k = 0; k < 8; ++k) {
            Queue next;
            next.base1[0]=i + Direction[k][0];
            next.base2[0]=j + Direction[k][1];
            next.base3[0]=Q.front;
            if(map[next.base1[0]][next.base2[0]] == 0 && mark[next.base1[0]][next.base2[0]] == 0){
                EnQueue(&Q,next.base1[0],next.base2[0],next.base3[0]);
                mark[next.base1[0]][next.base2[0]] = 1;
            }
        }
    }
    shuzuprint(mark);
    printf("不行");
    return 0;

}








int main(){
    int map[12][12];
    int mark[12][12];
    creatMap( map, mark);
    shuzuprint(map);
    FindWay(1, 1, 10, 10,map,mark);

}

运行结果及报错内容

不能找到出口

我想要达到的结果

程序可以找到出口

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。