zoukankan      html  css  js  c++  java
  • 牛客寒假6-J.迷宫

    链接:https://ac.nowcoder.com/acm/contest/332/J

    题意:

    你在一个 n 行 m 列的网格迷宫中,迷宫的每一格要么为空,要么有一个障碍。
    你当前在第 r 行第 c 列(保证该格子为空)。每次移动你可以向上下左右任意一个方向移动一格,前提是不能走到障碍上,也不能超出迷宫的边界。
    你向左移动的次数不能超过 x 次,向右不能超过 y 次。
    问在这种情况下,对于每个格子,是否存在一种移动方案让你走到它。
    输出有多少个格子存在移动方案让你走到它。

    思路:

    BFS 题目数据有点弱,普通bfs都过了。

    看博客找到一份hack代码。

    改了一下,感觉还是有点问题。

    Vis数组记录到某个点的左右剩余次数,当新过去的点剩余次数大于旧的,就更新一下,解决因为bfs顺序引起的问题。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long LL;
    
    const int MAXN = 1e3 + 10;
    int Next[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    
    struct Node
    {
        int _x;
        int _y;
        int _l;
        int _r;
        Node(int x, int y, int l, int r):_x(x), _y(y), _l(l), _r(r){}
    };
    
    char Map[MAXN][MAXN];
    int Vis[MAXN][MAXN][2];
    int n, m, sx, sy;
    int l, r;
    
    int main()
    {
        cin >> n >> m;
        cin >> sx >> sy;
        cin >> l >> r;
        for (int i = 1;i <= n;i++)
        {
            for (int j = 1;j <= m;j++)
                cin >> Map[i][j];
        }
        queue<Node> que;
        que.emplace(sx,sy,l,r);
        Map[sx][sy] = '+';
        Vis[sx][sy][0] = l;
        Vis[sx][sy][1] = r;
        while (!que.empty())
        {
            Node now = que.front();
            for (int i = 0;i < 4;i++)
            {
                int tx = now._x + Next[i][0];
                int ty = now._y + Next[i][1];
                if (tx < 1 || tx > n || ty < 1 || ty > m)
                    continue;
                if (Map[tx][ty] == '*')
                    continue;
                if (i == 1)
                {
                    if (now._r == 0)
                        continue;
                    Map[tx][ty] = '+';
                    if (Vis[now._x][now._y][0] > Vis[tx][ty][0] || Vis[now._x][now._y][1] > Vis[tx][ty][1])
                    {
                        que.emplace(tx, ty, now._l, now._r - 1);
                        Vis[tx][ty][0] = Vis[now._x][now._y][0];
                        Vis[tx][ty][1] = Vis[now._x][now._y][1] - 1;
                    }
                }
                else if (i == 3)
                {
                    if (now._l == 0)
                        continue;
                    Map[tx][ty] = '+';
                    if (Vis[now._x][now._y][0] > Vis[tx][ty][0] || Vis[now._x][now._y][1] > Vis[tx][ty][1])
                    {
                        que.emplace(tx, ty, now._l - 1, now._r);
                        Vis[tx][ty][0] = Vis[now._x][now._y][0] - 1;
                        Vis[tx][ty][1] = Vis[now._x][now._y][1];
                    }
                }
                else
                {
                    Map[tx][ty] = '+';
                    if (Vis[now._x][now._y][0] > Vis[tx][ty][0] || Vis[now._x][now._y][1] > Vis[tx][ty][1])
                    {
                        que.emplace(tx, ty, now._l, now._r);
                        Vis[tx][ty][0] = Vis[now._x][now._y][0];
                        Vis[tx][ty][1] = Vis[now._x][now._y][1];
                    }
                }
            }
            que.pop();
        }
        int res = 0;
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= m;j++)
                if (Map[i][j] == '+')
                    res++;
        /*
        for (int i = 1;i <= n;i++)
        {
            for (int j = 1;j <= m;j++)
                cout << Map[i][j];
            cout << endl;
        }
        */
        cout << res << endl;
    
        return 0;
    }
    

      

  • 相关阅读:
    makeObjectsPerformSelector 方法的用法
    UISearchBar控件
    iOS应用崩溃日志分析
    IOS崩溃日志分析
    iOS 中捕获程序崩溃日志
    iOS疯狂详解之imageIO完成渐进加载图片
    iOS中nil,NULL,Nil,NSNull的区别
    IOS 8 UITableView cell lines不能靠左解决方法
    Android小玩意儿-- 从头开发一个正经的MusicPlayer(三)
    Android小玩意儿-- 从头开发一个正经的MusicPlayer(二)
  • 原文地址:https://www.cnblogs.com/YDDDD/p/10352884.html
Copyright © 2011-2022 走看看