您的位置:首页 > 其它

hdu 1484 Basic wall maze bfs + 输出路径

2017-04-10 01:14 357 查看
题意:在6*6的网格中,有三堵墙。输入有5行,前两行是起点和终点,后面三行是墙的描述。求出起点到终点的行走方式,用E,N,S,w表示方位.
思路:用结构体描叙网格,每个网格有6个属性,分别代表4个方位是否可走,以及上一步的坐标,方便打印路径。最短路bfs即可。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 10;
char vis[maxn][maxn];
int Move[]={0,1,0,-1,0};//x,y+1  x+1,y  x,y-1  x-1,y
int si,sj,ei,ej,step;
struct node
{
bool up,down,right,left;
int li,lj;
};
struct pt
{
int i,j,li,lj;
pt(int i,int j):i(i),j(j){
}
};
node map[maxn][maxn];
bool check(int i,int j)
{
return i>=1&&i<=6&&j>=1&&j<=6;
}
void bfs()
{
vis[si][sj]=1;
queue<pt> q;
map[si][sj].li=map[si][sj].lj=-1;
q.push(pt(si,sj));
while(!q.empty())
{
int sz = q.size();
while(sz--)
{
pt a=q.front();q.pop();
int di=a.i;int dj=a.j;

if(di==ei&&dj==ej)
{
int cnt=0;char c[64];
c[cnt++]=vis[ei][ej];
int curi=map[ei][ej].li,curj=map[ei][ej].lj;
while(curi!=si||curj!=sj)
{
c[cnt++]=vis[curi][curj];
int ki,kj;
ki=map[curi][curj].li;kj=map[curi][curj].lj;
curi=ki;curj=kj;
}
for(int i=cnt-1;i>=0;i--)
printf("%c",c[i]);
printf("\n");
return;
}
for(int i=0;i<4;i++)
{
int ci=di+Move[i];
int cj=dj+Move[i+1];

if(check(ci,cj))
{
if(vis[ci][cj]==0&&Move[i]==1&&map[di][dj].down!=1)
{
q.push(pt(ci,cj));
map[ci][cj].li=di;
map[ci][cj].lj=dj;
vis[ci][cj]='S';
}
if(vis[ci][cj]==0&&Move[i]==-1&&map[di][dj].up!=1)
{
q.push(pt(ci,cj));
map[ci][cj].li=di;
map[ci][cj].lj=dj;
vis[ci][cj]='N';
}
if(vis[ci][cj]==0&&Move[i+1]==1&&map[di][dj].right!=1)
{
q.push(pt(ci,cj));
map[ci][cj].li=di;
map[ci][cj].lj=dj;
vis[ci][cj]='E';
}
if(vis[ci][cj]==0&&Move[i+1]==-1&&map[di][dj].left!=1)
{
q.push(pt(ci,cj));
map[ci][cj].li=di;
map[ci][cj].lj=dj;
vis[ci][cj]='W';
}
}

}
}
}
}
int main()
{

while(scanf("%d%d",&sj,&si)&&(si+sj))
{
scanf("%d%d",&ej,&ei);
int x1,y1,x2,y2;
memset(vis,0,sizeof(vis));
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
map[i][j].down=map[i][j].left
=map[i][j].right=map[i][j].up=0;
}
}
for(int i=0;i<3;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2)
{
int m1 = y1>y2?y1:y2;
int m2 = y1>y2?y2:y1;
for(int i=m2+1;i<=m1;i++)
{
map[i][x1].right=1;

4000
map[i][x1+1].left=1;
}
}
else if(y1==y2)
{
int m1 = x1>x2?x1:x2;
int m2 = x1>x2?x2:x1;
for(int i=m2+1;i<=m1;i++)
{
map[y1][i].down=1;
map[y1+1][i].up=1;
}
}
}
bfs();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: