#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int map[5][5]={
{0,0,0,-1,-1},
{0,-1,0,0,-1},
{0,0,0,0,-1},
{-1,0,0,0,0},
{-1,-1,0,0,0}
};
int did[5][5]={0};
typedef struct dip
{
int x;
int y;
int val;
}Dip;
queue<Dip>q;
int x_1=0,y_1=0;
int x_e=4,y_e=3;
int mve(int x_1,int y_1,int x_e,int y_e)
{
Dip e,e_1;
int x=x_1;
int y=y_1;
did[0][0]=9;
e.x=x;
e.y=y;
e.val=0;
q.push(e);
int i=0;
int u=0;
while(u<50)
{
u++;
e_1=q.front();
x=e_1.x;
y=e_1.y;
e.x=x;
e.y=y;
i=e_1.val+1;
if(x==4&&y==3)
{
printf("%d\n",e_1.val);
break;
}
if((x-1)>=0&&did[x-1][y]==0&&map[x-1][y]==0)
{
e.x--;
e.val=i;
q.push(e);
did[x-1][y]=i;
e.x++;
printf("([1]x=%d,y=%d\n",x,y);
printf("%d\n",e.val);
printf("\n");
}
if((x+1)<=4&&did[x+1][y]==0&&map[x+1][y]==0)
{
e.x++;
e.val=i;
q.push(e);
did[x+1][y]=i;
e.x--;
printf("([2]x=%d,y=%d\n",x,y);
printf("%d\n",e.val);
printf("\n");
}
if((y-1)>=0&&did[x][y-1]==0&&map[x][y-1]==0)
{
e.y--;
e.val=i;
q.push(e);
did[x][y-1]=i;
e.y++;
printf("([3]x=%d,y=%d\n",x,y);
printf("%d\n",e.val);
printf("\n");
}
if((y+1)<=4&&did[x][y+1]==0&&map[x][y+1]==0)
{
e.y++;
e.val=i;
q.push(e);
did[x][y+1]=i;
e.y--;
printf("([4]x=%d,y=%d\n",x,y);
printf("%d\n",e.val);
printf("\n");
}
q.pop();
}
}
int main()
{
mve(0,0,3,3);
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
printf("%d ",did[i][j]);
printf("\n");
}
return 0;
}
迷宫类看起来复杂,其实很简单。一般有两种方法:栈或队列;
栈:嘴巴进嘴巴出。
队列:嘴巴进肛门出。
很容易发现栈适合做单一路线的探索,就像一条虫子,头部十分灵活,探索一条路时使用。而队列可以当作多头蛇(只要头和屁股足够进近可以看作两个头????)
这边建议去搜索“广度优先搜索算法”,有很多图解讲的比我好,好像是什么电话找芒果商的例子,你就能更好得理解多头蛇。比如:
9 1 2 0 0 1 0 3 4 0 2 3 4 5 0 0 4 5 6 7 0 0 6 7 0
这个9是我瞎写的,其实是0;