首页 > 其他分享 >C语言之走迷宫深度和广度优先(利用堆栈和队列)

C语言之走迷宫深度和广度优先(利用堆栈和队列)

时间:2022-10-19 18:46:56浏览次数:56  
标签:队列 top next int lqnode 堆栈 maze C语言 stack

 

完成以下迷宫

 

利用二维数组储存每一个数组里的值,若是不能走则为1,若是可行就是0,走过了就设为2。

一般是再复制一个数组,用来记录。

堆栈的思想就是将一个点的上下左右都遍历一遍,若可行进栈,跳出遍历,再寻找下一个可走的。若遇到无路可走的就退回上一步,就是出栈。所以就是说堆栈里记录的是可以走到终点的路。

队列的思想就是一直找,把所有可以走的路都走一遍,直到遇到终点。

这里的每一个可以走的点都为链表中的一个节点,在队列中要记录这个点的上一点是什么,就是哪一个点衍生出的这个点。

若是堆栈,最后在出栈便是所走的路径,但是堆栈是后进先出的原理,可能为了好看最后要做些处理。

若是队列,最后是利用找到的终点的那个节点,一直找这个节点的上一个节点,上个节点的上个节点,一直找到起点,可能为了好看最后还是要做些处理。

这里就是按照上述方法做的,但是太懒了,做出来就没有处理了。

堆栈是比较简单的,主要是队列中的头部和尾部的节点设置,和进队列的时候是怎么循环,这个循环是怎么在遍历之前的节点的也同时在加入新的节点进队。后来我是没有用出队这个原理去做。

 

以下是用堆栈实现的

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<time.h>

 

typedef struct stack{

       int x;//记录下标

       int y;

       int direction;//记录方向

       struct stack *next;

}stack;

 

int main(){

       int maze[10][10];

       int i,j;

       for(i=0;i<10;i++){

              for(j=0;j<10;j++){

                     if(i==0 || j==0 || i==9|| j==9){

                            maze[i][j]=1;

                     } else{

                            maze[i][j]=0;

                     }

                    

              }

       }

       maze[1][3]=1;

       maze[1][7]=1;

       maze[2][3]=1;

       maze[2][7]=1;

       maze[3][5]=1;

       maze[3][6]=1;

       maze[4][2]=1;

       maze[4][3]=1;

       maze[4][4]=1;

       maze[5][4]=1;

       maze[6][2]=1;

       maze[6][6]=1;

       maze[7][2]=1;

       maze[7][3]=1;

       maze[7][4]=1;

       maze[7][6]=1;

       maze[7][7]=1;

       maze[8][1]=1;

      //这里是输进去的迷宫,也可以随机实现,但是这里偷下懒

 

       int cmaze[10][10];

       for(i=0;i<10;i++){

              for(j=0;j<10;j++){

                     cmaze[i][j]=maze[i][j];

              }

       }

//用一个新的二维数组记录走过的点

       printf("\n\n");

      

 

       stack *top,*p,*q,*t,*s;

       top=(stack *)malloc(sizeof(stack));

       top->next=NULL;

       //人为设置的,(1,1)是起点,(8,8)是终点

       int flag=0,x=0,y=0;

              if(flag==0){

              p=(stack *)malloc(sizeof(stack));

              p->x=1;

              p->y=1;

              p->direction=-1;

              q=top->next;

              top->next=p;

              p->next=q;

              flag=1;

              }

             

              q=top->next;

              x=q->x;

              y=q->y; 

       while(q->x!=8 || q->y!=8){

   //0:向左 y+1 1:向下 x+1 2:向右 y-1 3:向上 x+1

              if(cmaze[x][y+1]==0){

              p=(stack *)malloc(sizeof(stack));

              p->x=x;

              p->y=y+1;

              p->direction=0;

              q=top->next;

              top->next=p;

              p->next=q;

              cmaze[x][y+1]=2;

              }else if(cmaze[x+1][y]==0){

              p=(stack *)malloc(sizeof(stack));

              p->x=x+1;

              p->y=y;

              p->direction=1;

              q=top->next;

              top->next=p;

              p->next=q;

              cmaze[x+1][y]=2;

              }else if(cmaze[x][y-1]==0){

              p=(stack *)malloc(sizeof(stack));

              p->x=x;

              p->y=y-1;

              p->direction=2;

              q=top->next;

              top->next=p;

              p->next=q;

              cmaze[x][y-1]=2;

              }else if(cmaze[x+1][y]==0){

              p=(stack *)malloc(sizeof(stack));

              p->x=x;

              p->y=y-1;

              p->direction=3;

              q=top->next;

              top->next=p;

              p->next=q;

              cmaze[x+1][y]=2;

              }else{

                     t=top->next;

                     s=t->next;

                     top->next=s;

                     free(t);

                    

              }

              q=top->next;

              x=q->x;

              y=q->y;

//每次都是栈顶的元素找方向,找不到就是free掉,出栈,就是后退一步

              }

             

       for(i=0;i<10;i++){

              for(j=0;j<10;j++){

                     printf(" %d",cmaze[i][j]);

              }

              printf("\n");

       }

             

             

             

             

              printf("溯源:\n");

       while(top->next!=NULL){

              p=top->next;

              x=p->x;

              y=p->y;

              printf("x=%d,y=%d\n",x,y);

              top=top->next;

       }

      

      

       return 0;

      

      

 }

 

 

 

 

 

//队列

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define maxsize 10

#define null 0

typedef struct node{

       int x;

       int y;

       struct node*last;

       struct node*next;

} lqnode;

typedef struct{

       node *front,*rear;

}Queue;

 //定义一个队列的结构体,记录头和尾

int main(){

              int maze[10][10];

       int i,j;

       for(i=0;i<10;i++){

              for(j=0;j<10;j++){

                     if(i==0 || j==0 || i==9|| j==9){

                            maze[i][j]=1;

                     } else{

                            maze[i][j]=0;

                     }

                    

              }

       }

       maze[1][3]=1;

       maze[1][7]=1;

       maze[2][3]=1;

       maze[2][7]=1;

       maze[3][5]=1;

       maze[3][6]=1;

       maze[4][2]=1;

       maze[4][3]=1;

       maze[4][4]=1;

       maze[5][4]=1;

       maze[6][2]=1;

       maze[6][6]=1;

       maze[7][2]=1;

       maze[7][3]=1;

       maze[7][4]=1;

       maze[7][6]=1;

       maze[7][7]=1;

       maze[8][1]=1;

      

      

       for(i=0;i<10;i++){

              for(j=0;j<10;j++){

                     printf(" %d",maze[i][j]);

              }

              printf("\n");

       }

      

 

      

       Queue *q;

       lqnode *p;

       q=(Queue *)malloc(sizeof(Queue));

       p=(lqnode *)malloc(sizeof(lqnode));

       p->next=null;

       q->rear=p;

       q->front=p;

       int x,y;

 

        lqnode *r,*t;

        r=(lqnode *)malloc(sizeof(lqnode));

        r->x=1;

        r->y=1;

        r->last=null;

        q->rear->next=r;

        r->next=null;

        q->rear=r;

 

        

t=q->front->next;

       x=t->x;

       y=t->y;

      

printf("可以走的点\n");

while(x!=8 || y!=8){

      

 

        if(maze[x][y+1]==0){

            

        r=(lqnode *)malloc(sizeof(lqnode));

        r->x=x;

        r->y=y+1;

        r->last=t;

        q->rear->next=r;

        r->next=null;

        q->rear=r;

        maze[x][y+1]=2; 

              }

             

             

                           

        if(maze[x+1][y]==0){

             r=(lqnode *)malloc(sizeof(lqnode));

        r->x=x+1;

        r->y=y;

        r->last=t;

        q->rear->next=r;

        r->next=null;

        q->rear=r;

        maze[x+1][y]=2;

              }

             

        if(maze[x][y-1]==0){

             r=(lqnode *)malloc(sizeof(lqnode));

        r->x=x;

        r->y=y-1;

        r->last=t;

        q->rear->next=r;

        r->next=null;

        q->rear=r;

        maze[x][y-1]=2;

              }

             

             

      

        if(maze[x+1][y]==0){

             r=(lqnode *)malloc(sizeof(lqnode));

        r->x=x+1;

        r->y=y;

        r->last=t;

        q->rear->next=r;

        r->next=null;

        q->rear=r;

        maze[x+1][y]=2;

              }

      //可以走的就加入队列,然后队列是从头开始循环的,一边循环一边加入了新元素

       t=t->next;

       x=t->x;

       y=t->y;

              printf("%d,%d\n",x,y);

}

 

      

       printf("溯源:\n");

      while(t->last!=NULL){

             printf("x=%d,y=%d\n",t->x,t->y);

             t=t->last;

        }

 //用last记录每一个节点是由哪个节点走过来的

        return 0;

        

}

 

 

 1 1 1 1 是上面的迷宫,截图没有截好

标签:队列,top,next,int,lqnode,堆栈,maze,C语言,stack
From: https://www.cnblogs.com/mdddd-yep/p/16806611.html

相关文章

  • C语言初级阶段3——循环与分支
    C语言初级阶段4——数组1——一维数组1.定义:类型相同,内存连续的集合。(数据的组合)2.数组的定义格式:类型说明符数组名[数组的大小](1)类型说明符:数据类型(2)数组名:必须是合......
  • 实验2 C语言控制语句应用编程
    1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#defineN55intmain()6{7intnumber;8inti;9srand(time(0));10......
  • 顺序队列
    顺序队列:在顺序队列中有queueElem,front,rear,maxSizequeueElem代表队列的存储空间front代表队首的位置rear代表队尾的位置的下一个位置。maxSize代表最多放存储个数。......
  • 实验2 C语言控制语句应用编程
    1试验任务一(1)task1.c源代码,及,运行结果截图   #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5intmain(){intnumber;inti;......
  • C语言-打印菱形
    #include<stdio.h>#include<stdlib.h>/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/intmain(intargc,c......
  • 【C语言知识碎片】字符串函数
    1.strlenize_tstrlen(constchar*str);字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不含'\0')。注意如果字符串结尾没有\0s......
  • C语言中这么骚的退出程序的方式你知道几个?
    C语言中这么骚的退出程序的方式你知道几个?前言在本篇文章当中主要给大家介绍C语言当中一些不常用的特性,比如在main函数之前和之后设置我们想要执行的函数,以及各种花式退......
  • C语言实例3
    题目:在100内,一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?程序分析:在100以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如......
  • C语言中的字符串、转义字符、注释
    一.字符串"helloworld!\n"现这种由双引号引起来的一串字符称为字符串面值,简称字符串。这里需要注意:字符串的结束标志是一个\0的转义字符。在计算字符串长度时\0是结束标志,......
  • Elasticsearch 线程池和队列问题,请先看这一篇
    手敲脑图串讲Elasticsearch核心知识点1、线程池相关线上实战问题问题1:从Kafka消费数据导入elasticsearch时,批量bulk写入抛异常被拒绝。ES集群四个节点,其中:两个节......