hdu 1484 Basic wall maze bfs + 输出路径

题意:在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;
					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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值