• 浙江大学2015年校赛F题 ZOJ 3865 Superbot BFS 搜索


     不知道为什么比赛的时候一直想着用DFS 来写

    一直想剪枝结果还是TLE = = 

    这题数据量不大,又是问最优解,那么一般来说是用 BFS 来写

    int commandi[4] = {1, 2, 3, 4};
    

    我定义了一个方向数组,其实题目意思中的,指针移动还有操作版的变化本质上都是指针的移动

    在此只需要 额外定义一个变量 cur 在数组 commandi 中循环移动即可

    这道题目还是因为数据量不大吧,直接用 STL 中的 Queue 即可,优先队列肯定会更快。

    总体来说,还是一道容易题。

    Source Code :

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <string>
    #include <map>
    #include <set>
    #include <queue>
    #include <list>
    #include <vector>
    #include <algorithm>
    #define Max(a,b) (((a) > (b)) ? (a) : (b))
    #define Min(a,b) (((a) < (b)) ? (a) : (b))
    #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    #define MOD 1000000007
    #define pi acos(-1.0)
    
    using namespace std;
    
    typedef long long           ll      ;
    typedef unsigned long long  ull     ;
    typedef unsigned int        uint    ;
    typedef unsigned char       uchar   ;
    
    template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
    template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}
    
    const double eps = 1e-7      ;
    const int N = 210            ;
    const int M = 1100011*2      ;
    const ll P = 10000000097ll   ;
    const int MAXN = 10900000    ;
    const int INF = 0x3f3f3f3f   ;
    
    const int dir_x[5] = {0, 0, 0, -1, 1};
    const int dir_y[5] = {0, -1, 1, 0, 0};
    
    struct sc {
        int x, y;
        int time;
        int cur;
    } st, ed;
    
    int n, m, p;
    char a[20][20];
    bool vis[20][20][5];
    int commandi[4] = {1, 2, 3, 4};
    queue <sc> q;
    
    bool check (int x, int y) {
        return x >= 1 && x <= n && y >= 1 && y <= m;
    }
    
    int left (int &cur) {
        cur = (cur - 1 + 4) % 4;
    }
    
    int right (int & cur) {
        cur = (cur + 1 + 4) % 4;
    }
    
    void solve (struct sc v) {
        ++v.time;
        if (v.time % p == 0) {
            left (v.cur);
        }
        if (vis[v.x][v.y][commandi [v.cur]] == false) {
            vis[v.x][v.y][commandi [v.cur]] = true;
            q.push (v);
        }
    }
    
    void bfs () {
        int ans = -INF;
    
        sc e;
        e = st;
        e.time = 0;
        e.cur = 0;
    
        memset (vis, 0, sizeof (vis));
        vis [e.x][e.y][commandi [e.cur]] = true;
        q.push (e);
    
        while (!q.empty ()) {
            sc u = q.front ();
            q.pop ();
            if ((u.x == ed.x && u.y == ed.y) || '$' == a[u.x][u.y]) {
                ans = u.time;
                break;
            }
    
            sc v = u;   //to left
            left (v.cur);
            solve (v);
    
            v = u;      //to right
            right (v.cur);
            solve (v);
    
            v = u;      //wait
            solve (v);
    
            v = u;      //press
            int dr = commandi [v.cur];
            v.x += dir_x[dr];
            v.y += dir_y[dr];
            if (!check (v.x, v.y))  continue;
            if ('*' == a[v.x][v.y]) continue;
            solve (v);
        }
    
        if (-INF == ans) {
            cout << "YouBadbad" << endl;
        } else {
            cout << ans << endl;
        }
    }
    
    int main () {
        int i, j, t;
    
        cin >> t;
        while (t--) {
            while (!q.empty ()) q.pop ();
            cin >> n >> m >> p;
            for (i = 1; i <= n; ++i) {
                for (j = 1; j <= m; ++j) {
                    cin >> a[i][j];
                    if ('@' == a[i][j]) {
                        st.x = i;
                        st.y = j;
                    } else if ('$' == a[i][j]) {
                        ed.x = i;
                        ed.y = j;
                    }
                }
            }
            bfs ();
        }
    
        return 0;
    }
    
    
    /*
    10 10 3
    @.........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    ..........
    .........$
    
    10 5 3
    @....
    .....
    .....
    .....
    .....
    .....
    .....
    .....
    .....
    ....$
    */
  • 相关阅读:
    网页显示UIWebView(一个)
    借百度数据,建立你自己的程序
    引水数据--紧凑
    Unity3d 实时折射和反射
    snmp监控磁盘
    Linux snmp监控
    20监控工具
    Java 四舍五入
    Oracle主键操作
    SnmpTrap
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4422672.html
Copyright © 2020-2023  润新知