POJ2935 Basic Wall Maze bfs记录路径

链接:   POJ2935




题意:

6 X 6的地图   格子和格子可能有墙      整个地图中有三道墙      求起点起点到终点的路径


本题中的墙可以理解为某a位置的X方向不能走   即用一个三维数组map[x][y][z]表示(x,y)的Z方向不能走

关于记录路径可以用一个pre数组记录每个坐标的前一个坐标的复合值  最后倒序输出方向即可


代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
    int x,y;
} head;
int pre[10][10];
int vis[10][10];
bool map[7][7][4];               //实现墙的功能
int dir[4][2]= {1,0,0,1,-1,0,0,-1};
char fx[3][3];                  //存方向名称
int startx,starty,endx,endy;
void bfs()
{
    queue<node>q;
    vis[head.x][head.y]=1;
    q.push(head);
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        if(head.x==endx&&head.y==endy)
        {return;}
        int tx,ty;
        for(int i=0; i<4; i++)
        {
            tx=head.x+dir[i][0];
            ty=head.y+dir[i][1];
            if(tx<1||ty<1||tx>6||ty>6||vis[tx][ty]||map[head.x][head.y][i])
                continue;
            vis[tx][ty]=1;
            pre[tx][ty]=head.x*7+head.y;   //前一个坐标的负荷坐标
            q.push( {tx,ty});
        }
    }
}
void output()
{
    int i,j=0;
    int tx,ty;
    char q[49];
    fx[1][0]='E';fx[0][1]='S';fx[1][2]='W';fx[2][1]='N';         //x y 加1避免越界
    while(endx!=startx&&endy!=starty)
    {
        tx=pre[endx][endy]/7;
        ty=pre[endx][endy]%7;          //解密得前一个坐标
        q[j++]=fx[tx-endx+1][ty-endy+1];
        endx=tx;endy=ty;
    }
    for(j=j-2;j>=0;j--)
        cout<<q[j];
        cout<<endl;
    return ;
}
int main()
{
    while(scanf("%d%d",&head.y,&head.x)&&(head.x!=0))
    {
        scanf("%d%d",&endy,&endx);
        memset(map,false,sizeof(map));
        memset(pre,0,sizeof(pre));
        memset(vis,0,sizeof(vis));
        int i,j=3,ax,ay,bx,by,t;
        while(j--)                      //实现墙的功能
        {
            scanf("%d%d%d%d",&ay,&ax,&by,&bx);
            if(ay>by)
            {t=ay;ay=by;by=t;}
            if(ax>bx)
            {t=ax;ax=bx;bx=t;}
            if(ay==by)
            {
                for(i=ax+1; i<=bx; i++)
                {
                    map[i][ay][1]=1;
                    map[i][ay+1][3]=1;
                }
            }
            if(ax==bx)
            {
                for(i=ay+1; i<=by; i++)
                {
                    map[ax][i][0]=1;
                    map[ax+1][i][2]=1;
                }
            }
        }
        bfs();
        output();
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值