三维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;
}