hdu2364

题目

三维vis判重

每个格子可以走四次  即头的不同四个朝向走在一个格子上的状态

当两边有障碍的时候向前走, 无障碍或者一个障碍的时候优先向左右走

bfs即可

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
const int maxn = 85;

struct node{
    int x, y, d, s;
    node(){}
    node(int _x,int _y,int _d,int _s)
    {
        x = _x;
        y = _y;
        d = _d;
        s = _s;
    }
    friend bool operator < (const node &a,const node &b)
    {
        return a.s > b.s;
    }
};
int dir[5][2] = {{0,0},{1,0},{0,1},{-1,0},{0,-1}};
char mp[maxn][maxn];
int vis[maxn][maxn][5];
int h, w;
int sx, sy;

int bfs()
{
    memset(vis,0,sizeof(vis));
    priority_queue<node> q;
    q.push(node(sx,sy,-1,0));

    while(!q.empty())
    {
        node t = q.top();
        q.pop();

        if(t.x == 1 || t.y == 1 || t.x == h || t.y == w)
            return t.s;

        for(int i = 1;i <= 4;i ++)
        {
            int dx = t.x +dir[i][0];
            int dy = t.y +dir[i][1];

            if(!vis[dx][dy][i] && mp[dx][dy] != '#')
            {
                if(t.d%2 == i%2)
                {
                    if(t.d == i)
                    {
                        if(i%2==1 && mp[t.x][t.y+1] == '#' && mp[t.x][t.y-1] == '#')
                        {
                            vis[dx][dy][i] = 1;
                            q.push(node(dx,dy,i,t.s+1));
                        }
                        if(i%2==0 && mp[t.x+1][t.y] == '#' && mp[t.x-1][t.y] == '#')
                        {
                            vis[dx][dy][i] = 1;
                            q.push(node(dx,dy,i,t.s+1));
                        }
                    }
                }
                else
                {
                    q.push(node(dx,dy,i,t.s+1));
                    vis[dx][dy][i] = 1;
                }
            }

        }
    }
    return -1;
}
int main()
{
	int t;
	cin >> t;
	while(t --)
    {
        cin >> h >> w;
        for(int i = 1;i <= h;i ++)
        {

            for(int j = 1;j <= w;j ++)
            {

               cin >> mp[i][j];
               if(mp[i][j] == '@')
               {
                   sx = i;
                   sy = j;
               }
            }
        }

        cout << bfs() << endl;


    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/81152361