• Codeforces 1064D Labyrinth(双端队列BFS)


    题意:

    给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子

    思路:

    BFS,每次将上下走的策略加入队首,左右加入队尾,(相当于上下走比左右走优先级大的优先队列),这样可以保证先到某一格时剩余的疲劳度是最大的

    但是,,如果上下左右都限制,该咋办啊。。有没有大佬能给个思路啊

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<stack>
    #include<queue>
    #include<deque>
    #include<set>
    #include<vector>
    #include<map>
    #include<functional>
        
    #define fst first
    #define sc second
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    #define lson l,mid,root<<1
    #define rson mid+1,r,root<<1|1
    #define lc root<<1
    #define rc root<<1|1
    #define lowbit(x) ((x)&(-x)) 
    
    using namespace std;
    
    typedef double db;
    typedef long double ldb;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> PI;
    typedef pair<ll,ll> PLL;
    
    const db eps = 1e-6;
    const int mod = 998244353;
    const int maxn = 2e6+100;
    const int maxm = 2e6+100;
    const int inf = 0x3f3f3f3f;
    const db pi = acos(-1.0);
    
    int n, m;
    int rx, ry;
    int L, R;
    char a[2000 + 10][2000 + 10];
    int vis[2000 + 10][2000 + 10];
    struct node{
        int l, r;
        int x, y;
        node(int x=0, int y=0, int l=0, int r=0):x(x),y(y),l(l),r(r){}
    };
    deque<node>q;
    int main() {
        mem(vis, 0);
        scanf("%d %d", &n, &m);
        scanf("%d %d", &rx, &ry);
        scanf("%d %d", &L, &R);
        for(int i = 1; i <= n; i++)scanf("%s",a[i]+1);
        q.push_front(node(rx,ry,L,R));
        while(!q.empty()){
            node p = q.front();
            q.pop_front();
            int x = p.x;
            int y = p.y;
            int l = p.l;
            int r = p.r;
            //printf("%d %d %d %d
    ", x,y,l,r);
            if(vis[x][y])continue;
            vis[x][y]=1;
            if(l&&y-1>=1&&a[x][y-1]=='.'){
                q.push_back(node(x,y-1,l-1,r));
            }
            if(r&&y+1<=m&&a[x][y+1]=='.'){
                q.push_back(node(x,y+1,l,r-1));
            }
    
            if(x+1<=n&&a[x+1][y]=='.'){
                q.push_front(node(x+1,y,l,r));
            }
            if(x-1>=1&&a[x-1][y]=='.'){
                q.push_front(node(x-1,y,l,r));
            }
            
        }
        int ans = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(vis[i][j]==1){ans++;
                }
            }
        }
        printf("%d", ans);
        return 0;
    
    }
    /*
    6 5
    1 5
    5 1
    .....
    .***.
    ...*.
    *.**.
    *.**.
    *....
     */
  • 相关阅读:
    如果男人是计算机,女人是软件(在开发过程中的偶然随想)
    C/C++ 可变参数函数的原理和应用
    Python学习记录Hello Word
    Unity 把数字,英文图片变成字体
    unity+Android+PC加载本地图片
    Python学习记录安装
    Android学习 问题与答案
    Android 第三方 APK 包的静默安装
    Android学习 问题与答案 (2)
    JNI 之 HelloWorld
  • 原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/9789463.html
Copyright © 2020-2023  润新知