#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;
}
二维数组的输入可以用简易的方法进行输入,我这种方法属实有点傻哈哈哈哈哈哈
效果展示(只能看个大概,只能跑了代码才知道效果)
然后有个@会不停的寻路,从起点一直走到终点,完成迷宫的寻路。
不知道怎么搞动图,就只能这样看个大概了。。。