深度遍历迷宫求解

 运用栈迷宫求解。

 

  
  
  
  
  1. #include <stdio.h> 
  2. #define MAXSIZE  150 
  3. struct  
  4.     int i; int j; int di; 
  5. }st[MAXSIZE]; 
  6.  
  7. int mg[10][10] = { 
  8.                 {1,1,1,1,1,1,1,1,1,1}, 
  9.                 {1,0,0,1,0,0,0,1,0,1}, 
  10.                 {1,0,0,1,0,0,0,1,0,1}, 
  11.                 {1,0,0,0,0,1,1,0,0,1}, 
  12.                 {1,0,1,1,1,0,0,0,0,1}, 
  13.                 {1,0,0,0,1,0,0,0,0,1}, 
  14.                 {1,0,1,0,0,0,1,0,0,1}, 
  15.                 {1,0,1,1,1,0,1,1,0,1}, 
  16.                 {1,1,0,0,0,0,0,0,0,1}, 
  17.                 {1,1,1,1,1,1,1,1,1,1} 
  18. }; 
  19.  
  20. void mgpath(int x1, int y1, int x2, int y2) 
  21.     int i,j, di, find, k, top = -1; 
  22.     top++; 
  23.     st[top].i = i = x1; st[top].j = j = y1; st[top].di = di = -1; 
  24.     mg[x1][y1] = -1; 
  25.     while(top > -1) 
  26.     { 
  27.         if(st[top].i == x2 && st[top].j == y2)      //用来判读是否到达出点 
  28.         { 
  29.             for(k = 0; k <= top; k++)            
  30.                 printf("i = %d , j = %d , di = %d .\n",st[k].i, st[k].j, st[k].di);          
  31.             return ; 
  32.         } 
  33.         find = 0;             //标志用来表示是否 找到下一个节点,要是找到那么 使其进栈,否则出栈节点并且把出栈节点相应的坐标值重新赋予 0 ,使其可走 
  34.         while(find ==0 && st[top].di < 4) 
  35.         { 
  36.             st[top].di ++; 
  37.             switch(st[top].di) 
  38.             { 
  39.                 case 0: 
  40.                     i = st[top].i -1 ; j = st[top].j; if(mg[i][j] == 0) find = 1;break
  41.                 case 1: 
  42.                     i = st[top].i ; j = st[top].j + 1; if(mg[i][j] == 0) find = 1; break
  43.                 case 2: 
  44.                     i = st[top].i + 1; j = st[top].j ; if(mg[i][j] == 0) find = 1; break
  45.                 case 3: 
  46.                     i = st[top].i ; j = st[top].j -1 ; if(mg[i][j] == 0) find = 1; break
  47.             } 
  48.         } 
  49.         if(find == 1) 
  50.         { 
  51.               //在此处赋给其 方向,因为只有找到下一个节点的时候 ,才知道它的具体方向 
  52.             top++; 
  53.             st[top].i = i; st[top].j = j; st[top].di = -1;  //找到则进栈 
  54.             mg[i][j] = -1;                                   //此处设置为不可走 
  55.         }else  
  56.         { 
  57.             mg[st[top].i][st[top].j] = 0;                     //找不到则出栈,并且设置其为可走,虽然设置其为可走,但是却不会形成死循环,因为它的方向是递增的 
  58.             top--;                                             //即是用 di 方向变量来 确定其下一个值 
  59.         } 
  60.     } 
  61.     printf("\n没有符合的路径\n"); 
  62.  
  63. void main1() 
  64.     mgpath(1,1,8,8); 

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