zoj 3103 Cliff Climbing 优先队列+BFS

题目链接:

3103




  
  
题意: 一块N X M 的墙壁,求从S点出发 到T点的最短时间 每次只能爬一步,且只能左右脚交替爬行,墙上每个方块中的数字标明方块的"光滑 等级",标有数字t 的方块将花费他t 个单位时间安全地将他的脚踏在上面。 题解: 队列结构体中有4个变量(x,y,步数,固定的脚(0左脚,1右脚))。将所有s点的左脚开始和右脚开始 加入队列 标记数组要有三维 表示用哪只脚访问了这个坐标(x,y) 然后加入优先队列优化 按BFS搜索 第一个到达T的即是答案 代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
    int x,y,step,flag;
    friend bool operator<(const node a,node b)        //优先队列 时间少优先
    {
        return a.step>b.step;
    }
} head;
char map[105][105];
int vis[2][105][105];  //三维
int fx[2][9][2]= {{0,1, 0,2, 0,3, 1,1, 1,2, 2,1, -1,1, -1,2, -2,1},{0,-1, 0,-2, 0,-3, 1,-1, 1,-2, 2,-1, -1,-1, -1,-2, -2,-1}}; //左脚和右脚的9个方向
int m,n,ans;
void bfs()
{
    priority_queue<node>q;
    int i,j,tx,ty;
    for(i=1; i<=m; i++)
        for(j=1; j<=n; j++)
        {
            cin>>map[i][j];
            if(map[i][j]=='S')
            {
                q.push((node){i,j,0,0});
                q.push((node){i,j,0,1});                     //左脚右脚开始 都要加入
                vis[0][i][j]=vis[1][i][j]=1;
            }
        }
    while(!q.empty())
    {
        head=q.top();
        q.pop();
        for(i=0; i<9; i++)
        {
            tx=head.x+fx[head.flag][i][0];
            ty=head.y+fx[head.flag][i][1];
            if(tx<1||ty<1||tx>m||ty>n||vis[1-head.flag][tx][ty]||map[tx][ty]=='X')   //当前是head.flag表示的脚     则下一步是1-head.flag表示的脚
                continue;
            vis[1-head.flag][tx][ty]=1;
            if(map[tx][ty]=='T')
            {
                ans=head.step;
                return;
            }
            q.push((node){tx,ty,head.step+map[tx][ty]-'0',1-head.flag});
        }
    }
    return;
}
int main()
{
    while(scanf("%d%d",&n,&m)&&m)
    {
        ans=-1;
        memset(vis,0,sizeof(vis));
        bfs();
        cout<<ans<<endl;
    }
    return 0;
}



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值