广搜
记录一下该节点的前一个节点就行
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
左上角到右下角的最短路径,格式如样例所示。
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<stdio.h>
#include<stack>
int maze[6][6];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool book[6][6];
using namespace std;
struct list
{
int x;
int y;
int prex;
int prey;
};
struct node
{
int x;
int y;
};
bool check(int x,int y);
int main()
{
int i,j,top,tail;
struct list an[30];
struct node reco;
stack <struct node> s;
top=0,tail=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf(" %d",&maze[i][j]);
}
}
an[0].x=0;
an[0].y=0;
an[0].prex=-1;
an[0].prey=-1;
book[0][0]=true;
tail++;
while(an[top].x!=4||an[top].y!=4)
{
for(i=0;i<4;i++)
{
if(check(an[top].x+dir[i][0],an[top].y+dir[i][1]))
{
an[tail].x=an[top].x+dir[i][0];
an[tail].y=an[top].y+dir[i][1];
an[tail].prex=an[top].x;
an[tail].prey=an[top].y;
book[an[tail].x][an[tail].y]=true;
tail++;
}
}
top++;
}
reco.x=an[top].x;
reco.y=an[top].y;
s.push(reco);
reco.x=an[top].prex;
reco.y=an[top].prey;
s.push(reco);
while(s.top().x!=0||s.top().y!=0)
{
if(an[top].x==s.top().x&&an[top].y==s.top().y)
{
reco.x=an[top].prex;
reco.y=an[top].prey;
s.push(reco);
}
top--;
}
while(!s.empty())
{
printf("(%d, %d)\n",s.top().x,s.top().y);
s.pop();
}
return 0;
}
bool check(int x,int y)
{
if(x>=0&&x<5&&y>=0&&y<5&&book[x][y]==false&&maze[x][y]==0)
return true;
return false;
}