C语言 队列解决迷宫问题

对迷宫八个方向逐一搜索,若可通行这入队,并将已经通行的位置赋值1(避免重复搜索)

初始化队列

struct stack *Queue()
    {
    	struct stack *S;
    	S = (struct stack *)malloc(sizeof(struct stack));//分配队列空间 
    	S->head=0;//队列首指针 
    	S->tail=1;//队列尾指针 
    	S->a[S->head] = (struct queue *)malloc(sizeof(struct queue));
    	S->a[S->head]->high_seat=-1;//队列上一级位置 
    	S->a[S->head]->i=1;S->a[S->head=0]->j=1;//迷宫入口 
    	return S;
	 } 

创建一个随机迷宫

int **Create_maze(int row,int line)
    {
    	int i,j;
    	int **m;
    	m = (int **)malloc(row * sizeof(int *));//分配迷宫空间 
    	for(int i = 0; i < row; i++)
	     	{
	        	m[i] = (int *)malloc(line * sizeof(int));//分配迷宫空间 
          	}
    	
    	//printf("请输入迷宫图列(整个迷宫四周需均为墙体) 1 表示墙体,0 表示通路:\n");
    	printf("随机生成一个%d行%d列的迷宫!\n",row,line);
    	for(i=0;i<row;i++)
    	    {
    	    	//printf("请输入迷宫第%d行设置:\n",i);
			    for(j=0;j<line;j++)
    	        {
    	        //	scanf("%d",&m[i][j]); //输入迷宫路径 
    	            if(i==0||i==row-1||j==0||j==line-1)
    	                m[i][j]=1;
    	            else
    	                m[i][j] = rand()%3;
    	                if(m[i][j]>=2)
    	                    {
    	                    	m[i][j]=0;
							}
				}
			m[1][1]=0;
			m[row-2][line-2]=0;
			}
        return m; 
	}
	

迷宫路径搜索

//搜索迷宫路径
void Search_read(int **m,struct stack *S,int row,int line)
    {
    	int i,j;
        while(true)
             {
             if(S->head==S->tail)  //若队列头指针和尾指针相遇则迷宫无解
                    {
                        printf("NOPATH 该迷宫无解!");
                        exit(0);
			        }
             	i = S->a[S->head]->i;
             	j = S->a[S->head]->j;
             	if(i==row-2&&j==line-2) //若坐标到达出口则找到最后答案,结束搜索
				    {
				    	break;
					}
             //	printf("%d\n",S->head);
             //	printf("%d\n",i);
             	if(m[i-1][j]==0)
             	    {
             	    	Push(S,i-1,j,m);	
					}
				if(m[i-1][j+1]==0)
				    {
				    	Push(S,i-1,j+1,m);
					}
				if(m[i][j+1]==0)
				    {
				    	Push(S,i,j+1,m);
					}
				if(m[i+1][j+1]==0)
				    {
				    	Push(S,i+1,j+1,m);
					}
				if(m[i+1][j]==0)
				    {
				    	Push(S,i+1,j,m);
					}
				if(m[i+1][j-1]==0)
				    {
				    	Push(S,i+1,j-1,m);
					}
				if(m[i][j-1]==0)
				    {
				    	Push(S,i,j-1,m);
					}
				if(m[i-1][j-1]==0)
				    {
				    	Push(S,i-1,j-1,m);
					}
				
				S->head++;
			 }
	 } 
	 

完整代码


#include <stdio.h>
#include <stdlib.h>

#define SIZE 2500

struct queue//队列结构体 
    {
        int i;
		int j;
		int high_seat;	
	};
	
struct stack
    {
    	struct queue *a[SIZE];
    	int head;
    	int tail;
	};
	
//初始化队列 
struct stack *Queue()
    {
    	struct stack *S;
    	S = (struct stack *)malloc(sizeof(struct stack));//分配队列空间 
    	S->head=0;//队列首指针 
    	S->tail=1;//队列尾指针 
    	S->a[S->head] = (struct queue *)malloc(sizeof(struct queue));
    	S->a[S->head]->high_seat=-1;//队列上一级位置 
    	S->a[S->head]->i=1;S->a[S->head=0]->j=1;//迷宫入口 
    	return S;
	 } 
	 
//创建迷宫 
int **Create_maze(int row,int line)
    {
    	int i,j;
    	int **m;
    	m = (int **)malloc(row * sizeof(int *));//分配迷宫空间 
    	for(int i = 0; i < row; i++)
	     	{
	        	m[i] = (int *)malloc(line * sizeof(int));//分配迷宫空间 
          	}
    	
    	//printf("请输入迷宫图列(整个迷宫四周需均为墙体) 1 表示墙体,0 表示通路:\n");
    	printf("随机生成一个%d行%d列的迷宫!\n",row,line);
    	for(i=0;i<row;i++)
    	    {
    	    	//printf("请输入迷宫第%d行设置:\n",i);
			    for(j=0;j<line;j++)
    	        {
    	        //	scanf("%d",&m[i][j]); //输入迷宫路径 
    	            if(i==0||i==row-1||j==0||j==line-1)
    	                m[i][j]=1;
    	            else
    	                m[i][j] = rand()%3;
    	                if(m[i][j]>=2)
    	                    {
    	                    	m[i][j]=0;
							}
				}
			m[1][1]=0;
			m[row-2][line-2]=0;
			}
        return m; 
	}
	
//入队
void Push(struct stack* S,int i,int j,int **m)
    {
    	S->a[S->tail] = (struct queue *)malloc(sizeof(struct queue));
    	S->a[S->tail]->i=i;//保存该通路行号 
    	S->a[S->tail]->j=j;//保存该通路列号 
		S->a[S->tail]->high_seat=S->head; //保存该通路上一通路下标 
		S->tail++;
		m[i][j]=1;
	}


//打印迷宫
void Printf_m(int **m,int row,int line)
    {
    	int i,j;
    	printf("迷宫样式:\n");
    	for(i=0;i<row;i++)
    	    {
    	    	for(j=0;j<line;j++)
    	    	    {
    	    	    	
    	    	    	if(m[i][j]==1)
    	    	    	    {
    	    	    	        if((i==1&&j==0)||(i==row-2&&j==line-1))
								 printf("  ");
								else
								printf("■");	
							}
    	    	    	else
    	    	    	 printf("  ",m[i][j]);//遍历迷宫,并打印 	

					}
				printf("\n");
			}
        
	 } 

//打印迷宫路径
void Printf_read(struct stack *S)  
    {
    	S->tail--;
    	printf("迷宫最佳路径如下:\n"); 
	
    	do{	
    	    	printf("(%d,%d ) ",S->a[S->tail]->i,S->a[S->tail]->j);
    	    	S->tail=S->a[S->tail]->high_seat;
			}while((S->a[S->tail]->high_seat!=-1));	
		printf("(1,1)");
	} 
	
//搜索迷宫路径
void Search_read(int **m,struct stack *S,int row,int line)
    {
    	int i,j;
        while(true)
             {
             if(S->head==S->tail)
                    {
                        printf("NOPATH 该迷宫无解!");
                        exit(0);
			        }
             	i = S->a[S->head]->i;
             	j = S->a[S->head]->j;
             	if(i==row-2&&j==line-2)
				    {
				    	break;
					}
             //	printf("%d\n",S->head);
             //	printf("%d\n",i);
             	if(m[i-1][j]==0)
             	    {
             	    	Push(S,i-1,j,m);	
					}
				if(m[i-1][j+1]==0)
				    {
				    	Push(S,i-1,j+1,m);
					}
				if(m[i][j+1]==0)
				    {
				    	Push(S,i,j+1,m);
					}
				if(m[i+1][j+1]==0)
				    {
				    	Push(S,i+1,j+1,m);
					}
				if(m[i+1][j]==0)
				    {
				    	Push(S,i+1,j,m);
					}
				if(m[i+1][j-1]==0)
				    {
				    	Push(S,i+1,j-1,m);
					}
				if(m[i][j-1]==0)
				    {
				    	Push(S,i,j-1,m);
					}
				if(m[i-1][j-1]==0)
				    {
				    	Push(S,i-1,j-1,m);
					}
				
				S->head++;
			 }
	 } 
	 
int main()
    { 
        int **m;
        int row,line;
        struct stack *S;
        S = Queue();
        printf("请输入迷宫行数:\n");
        scanf("%d",&row);
        printf("请输入迷宫列数:\n");
        scanf("%d",&line);
    	m = Create_maze(row,line);
    	Printf_m(m,row,line);//打印迷宫 
    	Search_read(m,S,row,line);
    	Printf_read(S);
    	return 0;
	 } 

运行结果

迷宫为8方向搜索,即可歇着走。

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕仙少白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值