发不了问题只能发图片了
我的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);
}
不能找到出口
程序可以找到出口
不知道你这个问题是否已经解决, 如果还没有解决的话:你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。