TZOJ:7536 A Maze Game(双端队列--步数带限制的广搜)

题目链接:TZOJ:7536A Maze Game

题面:

样例输入1:

4 5
3 2
1 2
.....
.***.
...**
*....

样例输出1:

10

CF原题。双端队列板子题把。(没学双端的最好先学了)

就是最短路的思想:把向左移和向右移都看成是权值为1的边,向上或向下移动权值为0.

那么可以发现这个图的权值只有0或者1。可以用双端队列来做。

如果向左或向右移,把点放到队列后边,向上或向下移动,把点放到队列前边。

#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
struct Node{
    int x,y;
    int l,r;
};
char s[maxn][maxn];
bool flag[maxn][maxn];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int S,T;
int sl,sr;
bool judge(int x,int y){
    if(!flag[x][y]&&x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]!='*') return true;
    return false;
}
int bfs(){
    deque<Node> dq;
    dq.push_back({S,T,sl,sr});
    int ans=0;
    while(dq.size()){
        Node tmp=dq.front();
        dq.pop_front();
        int x=tmp.x,y=tmp.y,l=tmp.l,r=tmp.r;
        if(flag[x][y]) continue;
        flag[x][y]=true;
        ans++;
        for(int i=0;i<4;i++){
            int px=x+dir[i][0];
            int py=y+dir[i][1];
            if(!judge(px,py)) continue;
            if(i==2&&r>0) dq.push_back({px,py,l,r-1});
            else if(i==3&&l>0) dq.push_back({px,py,l-1,r});
            else if(i==0||i==1) dq.push_front({px,py,l,r});
        }
    }
    return ans;
}
int main(){
    cin>>n>>m>>S>>T>>sl>>sr;
    for(int i=1;i<=n;i++) cin>>s[i]+1;
    cout<<bfs()<<endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值