【hihocoder 1519】 逃离迷宫II

【题目链接】:http://hihocoder.com/problemset/problem/1519?sid=1098756

【题意】

Chinese

【题解】

bfs题;
根据bfs的性质;
第一次到达的点肯定是转弯次数最少的;
每次往一个方向走到头就好了;
搞个数组判判重.
这里在往一个方向走的时候;
如果途中遇到了终点;
也算能到达终点;
其他的就没什么坑点了;

【Number Of WA

3

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 510;

struct node
{
    int x,y,fx;
};

int f[N][N][5],n,m,sx,sy,tx,ty;
bool bo[N][N];
char s[N];
queue <node> dl;

int bfs(int x,int y)
{
    rep1(i,1,500)
        rep1(j,1,500)
            rep1(k,1,4)
                f[i][j][k] = -2;
    rep1(i,1,4)
    {
        f[x][y][i] = -1;
        int tq = x,tw = y;
        if (bo[tq+dx[i]][tw+dy[i]])
        {
            while (bo[tq+dx[i]][tw+dy[i]])
            {
                tq+=dx[i],tw+=dy[i];
                if (tq==tx && tw==ty) return 0;
            }
            f[tq][tw][i] = 0;
            dl.push(node{tq,tw,i});
        }
    }
    while (!dl.empty())
    {
        node temp = dl.front();
        int q = temp.x,w = temp.y,pre = temp.fx;
        dl.pop();
        rep1(i,1,4)
        {
            int tq = q,tw = w;
            if (bo[tq+dx[i]][tw+dy[i]])
            {
                while (bo[tq+dx[i]][tw+dy[i]])
                {
                    tq+=dx[i],tw+=dy[i];
                    if (tq==tx && tw==ty) return f[q][w][pre]+1;
                }
                if (f[tq][tw][i]==-2)
                {
                    f[tq][tw][i] = f[q][w][pre]+1;
                    dl.push(node{tq,tw,i});
                }
            }
        }
    }
    return -1;
}

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
    //init??????
    cin >> n >> m;
    rep1(i,1,n)
    {
        cin >>(s+1);
        rep1(j,1,m)
        {
            if (s[j]=='.')
                bo[i][j]=true;
            if (s[j]=='#')
                bo[i][j]=false;
            if (s[j]=='S')
            {
                bo[i][j] = true;
                sx = i,sy = j;
            }
            if (s[j]=='T')
            {
                bo[i][j] = true;
                tx = i,ty = j;
            }
        }
    }
    cout << bfs(sx,sy)<<endl;
    return 0;
}
posted @ 2017-10-04 18:44  AWCXV  阅读(141)  评论(0编辑  收藏  举报