zoukankan      html  css  js  c++  java
  • 穿越栅栏 Overfencing

    题解区里都是一次性走两步

    这里我就说一点

    按普通(每次走一步)的来最后(+1)再除以(2)就行了

    另外输入时加个时间限制 ((q++ if(q>=w)break;)

    /*
    ID:death_r2
    TASK:maze1
    LANG:C++
    */
    #include <queue>
    #include <cstdio>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define reg register int
    #define isdigit(x) ('0' <= x&&x <= '9')
    template<typename T>
    inline T Read(T Type)
    {
        T x = 0,f = 1;
        char a = getchar();
        while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();}
        while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();}
        return x * f;
    }
    string mp[210];
    bool vis[3][210][210];
    int cnt,ans,d[3][210][210],dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}},w,h;
    pair<int,int> s[3];
    #define pii_pii pair<int,pair<int,int> >
    inline void bfs(pair<int,int> s,int index)
    {
        priority_queue<pii_pii,vector<pii_pii >,greater<pii_pii > > q;
        q.push(make_pair(0,s));
        vis[index][s.first][s.second] = 1;
        while(!q.empty())
        {
            pii_pii it = q.top();q.pop();
            for(reg i = 0;i < 4;i++)
            {
                int x = it.second.first + dir[i][0];
                int y = it.second.second + dir[i][1];
                if(x < 1||x > h||y < 0||y >= w||mp[x][y] != ' '||vis[index][x][y]) continue;
                d[index][x][y] = d[index][it.second.first][it.second.second] + 1;
                vis[index][x][y] = 1;
                q.push(make_pair(d[index][x][y],make_pair(x,y)));
            }
        }
    }
    int main()
    {
    //    freopen("maze1.in","r",stdin);
    //    freopen("maze1.out","w",stdout);
        w = Read(1) << 1 ^ 1,h = Read(1) << 1 ^ 1;
        for(reg i = 1;i <= h;i++)
        {
            char x = getchar();
            while(x != ' '&&x != '|'&&x != '+'&&x != '-') x = getchar();
            int q = 0;
    		while(x != '
    ')
            {
            	++q;
                mp[i] += x;
                x = getchar();
     			if(q >= w) break;
            }
        }
        for(reg i = 1;i <= h;i++)
            while(mp[i].size() < w) mp[i] += ' ';
        for(reg i = 0;i < w;i++)
        {
            if(cnt == 2) break;
            if(mp[1][i] == ' ') s[++cnt] = make_pair(1,i);
            if(mp[h][i] == ' ') s[++cnt] = make_pair(h,i);
        }
        for(reg i = 1;i <= h;i++)
        {
            if(cnt == 2) break;
            if(mp[i][0] == ' ') s[++cnt] = make_pair(i,0);
            if(mp[i][w - 1] == ' ') s[++cnt] = make_pair(i,w - 1);
        }
        bfs(s[1],1),bfs(s[2],2);
        for(reg i = 1;i <= h;i++)
            for(reg j = 0;j < w;j++)
                ans = max(ans,min((d[1][i][j] + 1) / 2,(d[2][i][j] + 1) / 2));
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    AOJ 2200 Mr. Rito Post Office
    poj 3259 Wormholes
    01背包求解组合最值问题
    01背包求解面值组成问题
    金明的预算方案
    追赶法
    有关动态规划的一些定理。。。。。
    4980
    并查集
    快速幂
  • 原文地址:https://www.cnblogs.com/resftlmuttmotw/p/11965579.html
Copyright © 2011-2022 走看看