zoukankan      html  css  js  c++  java
  • Codeforces Round #354 (Div. 2) D. Theseus and labyrinth

    题目链接:

    http://codeforces.com/contest/676/problem/D

    题意:

    如果两个相邻的格子都有对应朝向的门,则可以从一个格子到另一个格子,给你初始坐标xt,yt,终点坐标xm,ym,现在你可以选择在原地把地图上所有格子顺时针旋转90度;或者往上下左右走一格,问走到终点的最短路。

    题解:

    三维的bfs最短路,就是写起来比较麻烦。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<utility>
    using namespace std;
    
    const int maxn = 1111;
    int n, m;
    
    char str[4][maxn][maxn];
    
    char mp[256],dir[256][4];
    void get_mp(){
        memset(mp, 0, sizeof(mp));
        mp['+'] = '+';
        mp['-'] = '|';
        mp['|'] = '-';
        mp['^'] = '>';
        mp['>'] = 'v';
        mp['v'] = '<';
        mp['<'] = '^';
        mp['L'] = 'U';
        mp['U'] = 'R';
        mp['R'] = 'D';
        mp['D'] = 'L';
        mp['*'] = '*';
    
        memset(dir, 0, sizeof(dir));
        dir['+'][0] = dir['+'][1] = dir['+'][2] = dir['+'][3] = 1;
        dir['-'][1]=dir['-'][3]=1;
        dir['|'][0]=dir['|'][2]=1;
        dir['^'][0]=1;
        dir['>'][1]=1;
        dir['v'][2]=1;
        dir['<'][3]=1;
        dir['L'][0]=dir['L'][1]=dir['L'][2]=1;
        dir['U'][1]=dir['U'][2]=dir['U'][3]=1;
        dir['R'][0]=dir['R'][2]=dir['R'][3]=1;
        dir['D'][0] = dir['D'][1] = dir['D'][3] = 1;
    }
    
    struct Node {
        int s, x, y;
        Node(int s, int x, int y) :s(s), x(x), y(y) {}
        Node() {}
    };
    
    int xt, yt, xm, ym;
    int d[4][maxn][maxn];
    int vis[4][maxn][maxn];
    int bfs() {
        memset(d, 0x3f, sizeof(d));
        memset(vis, 0, sizeof(vis));
        d[0][xt][yt] = 0;
        queue<Node> Q;
        Q.push(Node(0, xt, yt)); vis[0][xt][yt] = 1;
        while (!Q.empty()) {
            Node nd = Q.front(); Q.pop();
            int s = nd.s, x = nd.x, y = nd.y;
            if (x == xm&&y == ym) return d[s][x][y];
            int ss, xx, yy;
            ss = (s + 1) % 4, xx = x, yy = y;
            if (!vis[ss][xx][yy]) {
                d[ss][xx][yy] = d[s][x][y] + 1;
                Q.push(Node(ss, xx, yy));
                vis[ss][xx][yy] = 1;
            }
            ss = s, xx = x - 1, yy = y;
            if (!vis[ss][xx][yy]&&xx>=1&&dir[str[ss][xx][yy]][2]&&dir[str[s][x][y]][0]) {
                d[ss][xx][yy] = d[s][x][y] + 1;
                Q.push(Node(ss, xx, yy));
                vis[ss][xx][yy] = 1;
            }
            ss = s, xx = x + 1, yy = y;
            if (!vis[ss][xx][yy] && xx <=n && dir[str[ss][xx][yy]][0] && dir[str[s][x][y]][2]) {
                d[ss][xx][yy] = d[s][x][y] + 1;
                Q.push(Node(ss, xx, yy));
                vis[ss][xx][yy] = 1;
            }
            ss = s, xx = x, yy = y-1;
            if (!vis[ss][xx][yy] && yy >= 1 && dir[str[ss][xx][yy]][1] && dir[str[s][x][y]][3]) {
                d[ss][xx][yy] = d[s][x][y] + 1;
                Q.push(Node(ss, xx, yy));
                vis[ss][xx][yy] = 1;
            }
            ss = s, xx = x, yy = y + 1;
            if (!vis[ss][xx][yy] && yy <= m && dir[str[ss][xx][yy]][3] && dir[str[s][x][y]][1]) {
                d[ss][xx][yy] = d[s][x][y] + 1;
                Q.push(Node(ss, xx, yy));
                vis[ss][xx][yy] = 1;
            }
        }
        return -1;
    }
    
    int main() {
        get_mp();
        while (scanf("%d%d", &n, &m) == 2 && n) {
            for (int i = 1; i <= n; i++) scanf("%s", str[0][i]+1);
            for (int i = 1; i <= 3; i++) {
                for (int j = 1; j <= n; j++) {
                    for (int k = 1; k <= m; k++) {
                        str[i][j][k] = mp[str[i - 1][j][k]];
                    }
                }
            }
            scanf("%d%d%d%d", &xt, &yt, &xm, &ym);
            printf("%d
    ", bfs());
        }
        return 0;
    }
  • 相关阅读:
    Centos7安装nvidia显卡驱动
    Linux,Windows,Mac OS下换行的不同表示
    Linux权限管理问题
    Centos6.5final安装后若干问题与解决方法
    100天计划 绪
    python 变量,if,while,运算符
    python 初级重点
    py第四天
    搭建个人博客之路-01
    利用gulp+babel转es6
  • 原文地址:https://www.cnblogs.com/fenice/p/5537360.html
Copyright © 2011-2022 走看看