C语言实现迷宫寻路(需要自己手动创造迷宫)

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
#include<windows.h>
using namespace std;
int M[17][17];
int flag=0;
typedef struct ZBZ
{
  /* data */
  int X_dot;
  int Y_dot;
}XY;
stack<struct ZBZ> mystack;
XY temp[17][17];
void FindRoot(int O_x,int O_y,int N_x,int N_y)
{
  if(flag==1||M[N_x][N_y]==1)//找到出口或不可达,停止寻找
  return;
  else if(N_x==11&&N_y==16)//找到出口,则退出
  {
    temp[N_x][N_y].X_dot=O_x;
    temp[N_x][N_y].Y_dot=O_y;
    printf("FIND THE EXIT!!\r\n");
  flag=1;
  return;
  }
  else{
    temp[N_x][N_y].X_dot=O_x;
    temp[N_x][N_y].Y_dot=O_y;
  }//新探索的点 保存上个点的路径
  //往上寻找
  if(N_x-1>=0&&N_x-1!=O_x)
  FindRoot(N_x,N_y,N_x-1,N_y);
  //往左边
  if(N_y-1>=0&&N_y-1!=O_y)
  FindRoot(N_x,N_y,N_x,N_y-1);
  if(N_y+1<=16&&N_y+1!=O_y)//往右边寻找
  FindRoot(N_x,N_y,N_x,N_y+1);
  if(N_x+1<=16&&N_x+1!=O_x)
  FindRoot(N_x,N_y,N_x+1,N_y);
  return;
}
int main()
{
  printf("BEGAIN TO FIND THE ROUT TO THE EXIT!\r\n");
    for(int i=0;i<17;i++)
    for(int j=0;j<17;j++)
    {
      temp[i][j].X_dot=99;
      temp[i][j].Y_dot=99;
    }//重置保存的二维数组
    for(int i=0;i<17;i++)
    M[0][i]=1;//第一行
    //************
    for(int i=0;i<17;i++)
    M[1][i]=0;
    M[1][0]=1;
    M[1][12]=1;
    M[1][16]=1;
    //************
    for(int i=0;i<17;i++)
    M[2][i]=1;
    M[2][5]=0;
    M[2][9]=0;
    M[2][11]=0;
    M[2][15]=0;
    //************
    for(int i=0;i<17;i++)
    M[3][i]=0;    
    M[3][0]=1;
    M[3][4]=1;
    M[3][6]=1;
    M[3][10]=1;
    M[3][14]=1;
    M[3][16]=1;
    //*************
    for(int i=0;i<17;i++)
    M[4][i]=1;
    M[4][1]=0;
    M[4][3]=0;
    M[4][7]=0;
    M[4][13]=0;
    M[4][15]=0;
    //*************
    for(int i=0;i<17;i++)
    M[5][i]=0;
      M[5][2]=1;
        M[5][8]=1;
          M[5][10]=1;
            M[5][16]=1;
    for(int i=0;i<17;i++)
    M[6][i]=1;
    M[6][1]=0;
      M[6][7]=0;
        M[6][9]=0;
          M[6][11]=0;
    for(int i=0;i<17;i++)
    M[7][i]=0;
    M[7][0]=1;
      M[7][4]=1;
        M[7][8]=1;
          M[7][12]=1;
            M[7][16]=1;
    for(int i=0;i<17;i++)
    M[8][i]=1;
    M[8][3]=0;
      M[8][5]=0;
        M[8][9]=0;
          M[8][13]=0;
            M[8][15]=0;
    for(int i=0;i<17;i++)
    M[9][i]=0;
    M[9][0]=1;
      M[9][4]=1;
        M[9][6]=1;
          M[9][14]=1;
            M[9][16]=1;
    for(int i=0;i<17;i++)
    M[10][i]=1;
    M[10][7]=0;
    for(int i=0;i<17;i++)
    M[11][i]=0;
    M[11][0]=1;
     M[11][8]=1;
      M[11][14]=1;
    for(int i=0;i<17;i++)
    M[12][i]=1; 
    M[12][13]=0;
      M[12][1]=0;
        M[12][3]=0;
          M[12][9]=0;
            M[12][15]=0;
    for(int i=0;i<17;i++)
    M[13][i]=0; 
    M[13][0]=1;
      M[13][2]=1;
        M[13][6]=1;
          M[13][10]=1;
            M[13][12]=1;
              M[13][16]=1;
    for(int i=0;i<17;i++)
    M[14][i]=1; 
    M[14][1]=0;
      M[14][5]=0;
        M[14][7]=0;
          M[14][11]=0;
            M[14][13]=0;
    for(int i=0;i<17;i++)
    M[15][i]=0; 
    M[15][0]=1;
      M[15][4]=1;
        M[15][8]=1;
          M[15][16]=1;
    for(int i=0;i<17;i++)
    M[16][i]=1;    
FindRoot(5,0,5,1);
//printf("路径为 :\r\n");
int x=11;
int y=16;
int tt1,tt2;
XY LIN;
LIN.X_dot=11;
LIN.Y_dot=16;
mystack.push(LIN);
//printf("X_=%2d,  Y_=%2d\r\n",x,y);
while(temp[x][y].X_dot!=99){
//printf("X_=%2d,  Y_=%2d\r\n",temp[x][y].X_dot,temp[x][y].Y_dot);
LIN.X_dot=temp[x][y].X_dot;
LIN.Y_dot=temp[x][y].Y_dot;
mystack.push(LIN);
tt1=x;
tt2=y;
x=temp[tt1][tt2].X_dot;
y=temp[tt1][tt2].Y_dot;
}
while(mystack.empty()==0)
{
  system("cls");
    for(int i=0;i<17;i++)
    {
    for(int j=0;j<17;j++)
    {
      if(M[i][j]==1)
      printf("*");
      else if((i==5&&j==0)||(i==11&&j==16))
      printf("!");
      else if(i==mystack.top().X_dot&&j==mystack.top().Y_dot)
      printf("@");
      else 
      printf(" ");
    }
    printf("\n");
    }
        mystack.pop();
        Sleep(10);  
}

getchar();
return 0;
}

二维数组的输入可以用简易的方法进行输入,我这种方法属实有点傻哈哈哈哈哈哈

效果展示(只能看个大概,只能跑了代码才知道效果)

然后有个@会不停的寻路,从起点一直走到终点,完成迷宫的寻路。

不知道怎么搞动图,就只能这样看个大概了。。。

猜你喜欢

转载自blog.csdn.net/yoonaanna/article/details/123434836
今日推荐