广度遍历实现迷宫求解

  运用队列迷宫求解。

  
  
  
  
  1. #include <stdio.h> 
  2. #include "stdlib.h" 
  3. #define MAXSIZE 150 
  4.  
  5. int mg2[10][10] = { 
  6.                 {1,1,1,1,1,1,1,1,1,1}, 
  7.                 {1,0,0,1,0,0,0,1,0,1}, 
  8.                 {1,0,0,1,0,0,0,1,0,1}, 
  9.                 {1,0,0,0,0,1,1,0,0,1}, 
  10.                 {1,0,1,1,1,0,0,0,0,1}, 
  11.                 {1,0,0,0,1,0,0,0,0,1}, 
  12.                 {1,0,1,0,0,0,1,0,0,1}, 
  13.                 {1,0,1,1,1,0,1,1,0,1}, 
  14.                 {1,1,0,0,0,0,0,0,0,1}, 
  15.                 {1,1,1,1,1,1,1,1,1,1} 
  16. }; 
  17.  
  18. struct node  
  19.     int i,j,pre,di; 
  20. }sq[MAXSIZE]; 
  21.  
  22. void print(int front) 
  23. {   int pre = sq[front].pre; 
  24.     printf("倒着输出的路径为: \n"); 
  25.     while(pre != -1) 
  26.     { 
  27.         printf("i = %d ,j = %d ,di = %d\n",sq[pre].i, sq[pre].j, sq[pre].di); 
  28.         pre = sq[pre].pre; 
  29.     } 
  30.     printf("\n\n"); 
  31.  
  32. void mgpath2(int x1, int y1, int x2, int y2) 
  33.      
  34.     int front = -1; int rear = -1; int find = 0;  int i,j;     //front rear 是队列的头部和尾部  
  35.     rear++; 
  36.     sq[rear].i = i = x1; sq[rear].j = j = y1; sq[rear].di = -1; sq[rear].pre = -1;  //把开始的节点进队列,并初始化前一节点的下标和方向为 -1 
  37.     mg2[i][j] = -1;   
  38.     while(front <= rear)     //当队列中还有元素的时候进行循环 
  39.     {   
  40.         front ++ ; 
  41.         find = 0;              //出队列 
  42.         if(sq[front].i == x2 && sq[front].j == y2)   //判断到达目标的时候,打印输出路径 
  43.         {   
  44.             printf(front);              //此处没有直接返回 ,是想要打印全部的路径,但是目的没有达到,因为走过的节点被赋值为-1,也就不能再走一次,所以不能实现打印所有路径      
  45.         } 
  46.         while(sq[front].di < 4 && find == 0)      //此处得循环必须是四次,因为要把周围能走的坐标点都进入队列 
  47.         {   sq[front].di ++; 
  48.             switch(sq[front].di) 
  49.             { 
  50.                 case 0 : 
  51.                     i = sq[front].i - 1; j = sq[front].j ; if(mg2[i][j] == 0) find = 1; break
  52.                 case 1 : 
  53.                     i = sq[front].i; j = sq[front].j + 1 ; if(mg2[i][j] == 0) find = 1; break
  54.                 case 2 : 
  55.                     i = sq[front].i + 1; j = sq[front].j ; if(mg2[i][j] == 0) find = 1; break
  56.                 case 3 : 
  57.                     i = sq[front].i; j = sq[front].j - 1; if(mg2[i][j] == 0) find = 1; break
  58.             }        
  59.             if(find == 1)        //此处根据find的值判断是否找到可走的元素,然后根据情况判断是否应该如队列 
  60.             { 
  61.  
  62.                 rear++; 
  63.                 mg2[i][j] = -1; 
  64.                 sq[rear].i = i; sq[rear].j = j; sq[rear].di = -1; sq[rear].pre = front; 
  65.             } 
  66.             find = 0; 
  67.         } 
  68.     } 
  69.  
  70. //广度遍历 
  71. void main() 
  72.     mgpath2(1,1,8,8); 

你可能感兴趣的:(迷宫求解,广度遍历)