POJ-2935-Basic Wall Maze

378 篇文章 0 订阅

这个题用BFS搜索,题目大意是给你6*6的网格,其中第一行的2个数据表示起点,第二行的2个数据表示终点,第三行开始有3行,表示一道墙(可以当作一条线),有墙的地方相应不能通过。主要就是对墙需要特殊处理下。我采用的是用数组存是否该点能够上下左右通行,如果不能则map[i][j][k]=1(i,j)为该点坐标。求起点到终点的路线,用N,E,S,W代表东西南北,表示走的方向。

处理方法:

1、首先对网格周围一圈进行特殊处理

2、对于墙有2种可能

a、x坐标相同,则处理左右两边。

b、y坐标相同,则处理上下两边。

3、我是先找到最快到达终点的路线,然后回朔确定具体的路线,最后反向输出即为答案。

处理的时候注意按照题中所画的形式,否则可能会造成方向上的错误。

直接贴代码吧,还是比较简单:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define MAX 8
using namespace std;
int map[MAX][MAX][4],use[MAX][MAX],px[MAX][MAX],py[MAX][MAX],pos[MAX][MAX];//上右下左
int sx,sy,ex,ey,movex[4]={0,1,0,-1},movey[4]={-1,0,1,0};
char ways[5]={"NESW"};
int main()
{
    while(scanf("%d%d",&sx,&sy)&&(sx||sy))
    {
	memset(map,0,sizeof(map));
	memset(use,0,sizeof(use));
	for(int i=0;i<7;i++)
	    map[1][i][0]=map[6][i][2]=1;
	for(int i=0;i<7;i++)
	    map[i][1][3]=map[i][6][1]=1;
	scanf("%d%d",&ex,&ey);
	for(int i=0;i<3;i++)
	{
	    int ax,ay,bx,by;
	    scanf("%d%d%d%d",&ax,&ay,&bx,&by);
	    if(ax==bx)
	    {
		if(ax>0)
		{
		    for(int j=min(ay,by)+1;j<=max(ay,by);j++)
			map[j][ax][1]=1;
		}
		if(ax<6)
		    for(int j=min(ay,by)+1;j<=max(ay,by);j++)
			map[j][ax+1][3]=1;
	    }
	    else
	    {
		if(ay>0)
		    for(int j=min(ax,bx)+1;j<=max(ax,bx);j++)
			map[ay][j][2]=1;
		if(ay<6)
		    for(int j=min(ax,bx)+1;j<=max(ax,bx);j++)
			map[ay+1][j][0]=1;
	    }
	}
	queue<int> x,y;
	x.push(sx);
	y.push(sy);
	use[sy][sx]=1;
	int flag=0;
	while(!x.empty())
	{
	    int itx=x.front();
	    x.pop();
	    int ity=y.front();
	    y.pop();
	    for(int i=0;i<4;i++)
	    {
		if(map[ity][itx][i])
		    continue;
		int xx=itx+movex[i];
		int yy=ity+movey[i];
		if(use[yy][xx])
		    continue;
		px[yy][xx]=itx;
		py[yy][xx]=ity;
		pos[yy][xx]=i;
		use[yy][xx]=1;
		x.push(xx);
		y.push(yy);
		if(xx==ex&&yy==ey)
		{
		    flag=1;
		    break;
		}
	    }
	    if(flag)
		break;
	}
	int itx=ex,ity=ey,cou=0;
	char ans[300];
	while(!(itx==sx&&ity==sy))
	{
	    ans[cou++]=ways[pos[ity][itx]];
	    int ita=px[ity][itx],itb=py[ity][itx];
	    itx=ita,ity=itb;
	}
	for(int i=cou-1;i>=0;i--)
	    printf("%c",ans[i]);
	printf("\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值