迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 28425 | Accepted: 16402 |
Description
定义一个二维数组:
它表示一个迷宫,其中的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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
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
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
这里根据题意给出通法,运用BFS,同时用指针保留指向上一个状态,记录路径
参考博客http://blog.youkuaiyun.com/acmer_sly/article/details/52492245
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
#define MAXN 10005
int tu[MAXN][MAXN];
int vis[MAXN][MAXN];
struct node
{
int x,y;
int coun;
node *last;//指向上一个状态
};
int l,r;
int u,v;
int mov[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
node* bfs(int sx,int sy,int ex,int ey)
{
queue<node*>hh;
node *HA;//初始位置
HA=(node*)malloc(sizeof(node));
node *s;//当前位置
s=(node*)malloc(sizeof(node));
/*
* node *e;//过渡
* e=(node*)malloc(sizeof(node));
*
*/
HA->coun=0;
HA->x=sx;
HA->y=sy;
vis[sx][sy]=1;
hh.push(HA);//进队
while(!hh.empty())
{
s=hh.front();
hh.pop();
HA=NULL;
if((s->x==ex)&&(s->y==ey))
{
return s;
}
for(int i=0; i<4; i++)
{
u=s->x+mov[i][0];
v=s->y+mov[i][1];
node *e;//过渡,必须定义在里面,否则会造成last指针记录错误状态
e=(node*)malloc(sizeof(node));
if((!vis[u][v])&&((tu[u][v]==0)&&(u<l)&&(u>=0)&&(v>=0)&&(v<r)))
{
e->x=u;
e->y=v;
e->coun=s->coun+1;
e->last=s;//指向上一次状态
hh.push(e);
vis[u][v]++;
}
}
}
return NULL;
}
void output(node *s)
{
if(s==NULL)return;
output(s->last);
printf("(%d,%d)\n",s->x,s->y);
}
int main()
{
int sx,sy;//起点
int ex,ey;//终点
node *s;
while(scanf("%d%d",&l,&r)&&(l||r))
{
memset(tu,0,sizeof(tu));
memset(vis,0,sizeof(vis));
for(int i=0; i<l; i++)
{
for(int j=0; j<r; j++)
{
scanf("%d",&tu[i][j]);
}
}
scanf("%d%d",&sx,&sy);
scanf("%d%d",&ex,&ey);
s=bfs(sx,sy,ex,ey);
if(!s)
{
printf("no exist");
}
else
{
output(s);
printf("The shortest road is %d\n",s->coun);
}
}
return 0;
}