1. 程式人生 > >迷宮求解 所有路徑

迷宮求解 所有路徑

#include<stdio.h>

//#include<stdlib.h>

#define n1 10

#define n2 10

typedef struct node

{

       int x;//存x,y座標

       int y;

       int c;//存該店可能的下點所在方向,1表示右邊,2表示向上,3 左 4 下

}linkstack;

linkstack top[100];

//迷宮矩陣

int maze[n1][n2]={1,1,1,1,1,1,1,1,1,1,

                  0,0,0,1,0,0,0,1,0,1,

                              1,1,0,1,0,0,0,1,0,1,

                              1,0,0,0,0,1,1,0,0,1,

                              1,0,1,1,1,0,0,0,0,1,

                              1,0,0,0,1,0,0,0,0,0,

                              1,0,1,0,0,0,1,0,0,1,

                              1,0,1,1,1,0,1,1,0,1,

                              1,1,0,0,0,0,0,0,0,1,

                              1,1,1,1,1,1,1,1,1,1};

int i,j,k,m=0; //m記錄路徑個數

main()

{

       for(i=0;i<n1*n2;i++)

       {

              //初始化 top[] 置所有方向數向右

              top[i].c=1; //c存下點方向  初始全部向右

       }

       printf("the maze is (迷宮是):\n"); //列印原始迷宮矩陣

       for(i=0;i<n1;i++) //n1,n2 都是 10

       {

              for(j=0;j<n2;j++)

                     printf(maze[i][j]?"*":" "); //1為* 0為空格

              printf("\n");

       }

       i=0;

       top[i].x=1; //(1,0)為迷宮入口

       top[i].y=0;

       maze[1][0]=2; //賦值為2表示該點已經走過 0表示該點可以通過 1表示該點不能通過

       //回溯演算法

       do

       {     

//           printf("i= %d",i);

//           printf("\n");

              if(top[i].c<5) //共1(右) 2(上) 3 4個方向  小於5表示還可以向前試探

              {

                     if(top[i].x==9||top[i].y==9)//此處為改正後的語句

                     {

                            printf("路徑 %d 是:\n",++m);//列印路徑  m表示走過了多少個點

                            printf("共需要i= %d 步完成",i);

                            printf("\n");

                            for(j=0;j<=i;j++)

                            {

                                   printf("(%d,%d)->",top[j].x,top[j].y);

                            }

                            printf("\n");

                            //列印選出路徑的迷宮

                            for(j=0;j<n1;j++)

                            {

                                   for(k=0;k<n2;k++)

                                   {

                                          if(maze[j][k]==0) printf("  ");

                                          else if(maze[j][k]==2) printf("O ");

                                          else printf("* ");

                                   }

                                   printf("\n");

                            }

                            maze[top[i].x][top[i].y]=0; //恢復終點

                            top[i].c=1; //恢復終點

                            i--;

                            top[i].c+=1;

                            continue;

                     }//內層if

                     switch(top[i].c)

                     {

                      case 1://向前試探

                            {

                                   if(maze[top[i].x][top[i].y+1]==0)

                                   {

                                          i++;

                                          top[i].x=top[i-1].x;

                                          top[i].y=top[i-1].y+1;

                                          maze[top[i].x][top[i].y]=2;

                                   }

                                   else

                                   {

                                          top[i].c+=1;

                                   }

                                   break;

                            }

                      case 2://向上試探

                             {

                                    if(maze[top[i].x-1][top[i].y]==0)

                                   {

                                          i++;

                                          top[i].x=top[i-1].x-1;

                                          top[i].y=top[i-1].y;

                                          maze[top[i].x][top[i].y]=2;

                                   }

                                   else

                                   {

                                          top[i].c+=1;

                                   }

                                   break;

                             }

                      case 3://向左試探

                             {

                                    if(maze[top[i].x][top[i].y-1]==0)

                                   {

                                          i++;

                                          top[i].x=top[i-1].x;

                                          top[i].y=top[i-1].y-1;

                                          maze[top[i].x][top[i].y]=2;

                                   }

                                   else

                                   {

                                          top[i].c+=1;

                                   }

                                   break;

                             }

                      case 4://向下試探

                             {

                                    if(maze[top[i].x+1][top[i].y]==0)

                                   {

                                          i++;

                                          top[i].x=top[i-1].x+1;

                                          top[i].y=top[i-1].y;

                                          maze[top[i].x][top[i].y]=2;

                                   }

                                   else

                                   {

                                          top[i].c+=1;

                                   }

                                   break;

                             }

                     } //回溯

              }//外層 if

              else

              {

                     if(i==0) return; //已經找完所有解

                     maze[top[i].x][top[i].y]=0;//恢復該點為未走過的點

                     top[i].c=1;//恢復該點方向 

                     i--;//回退

                     top[i].c+=1;//回退至後一點並且改變方向繼續尋找路線

              }//else結束

       }

       while(1);

}//main結束