40分
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct jqr{
int x, y, d, step;
}qs, t, c;
int n, m, qx, qy, zx, zy, fx, vis[520][520][5], ma[550][550], nx, ny;
const int dx[5] = {0, 1, 0, -1, 0}, dy[5] = {0, 0, 1, 0, -1};
void input(), qj(), zw(), bfs();
queue<jqr> q;
signed main()
{
input(), qs.x = qx, qs.y = qy, qs.d = fx, qs.step = 0, vis[qy][qx][fx] = 1, q.push(qs), bfs();
return 0;
}
void input()
{
scanf ("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf ("%lld", &ma[i][j]);
if (ma[i][j])
ma[i - 1][j] = ma[i][j - 1] = ma[i - 1][j - 1] = 1;
}
char fxx;
scanf ("%lld%lld%lld%lld %c", &qx, &qy, &zx, &zy, &fxx);
if (fxx == 'E')
fx = 1;
if (fxx == 'S')
fx = 2;
if (fxx == 'W')
fx = 3;
if (fxx == 'N')
fx = 4;
if (qx >= n || qx < 1 || qy >= m || qy < 1 || ma[qx][qy])
printf ("%lld\n", -1LL), exit(0);
return;
}
void qj()
{
for (int i = 1; i <= 3; i++)
{
nx += dx[t.d], ny += dy[t.d];
if (nx >= n || nx < 1 || ny >= m || ny < 1 || ma[nx][ny])
break;
if (!vis[ny][nx][t.d])
vis[ny][nx][t.d] = 1, c.x = nx, c.y = ny, c.d = t.d, c.step = t.step + 1, q.push(c);
}
return;
}
void zw()
{
c.x = t.x, c.y = t.y, c.step = t.step + 1;
c.d = t.d - 1;
if (c.d == 0)
c.d = 4;
if (!vis[c.y][c.x][c.d])
vis[c.y][c.x][c.d] = 1, q.push(c);
c.d = t.d + 1;
if (c.d == 5)
c.d = 1;
if (!vis[c.y][c.x][c.d])
vis[c.y][c.x][c.d] = 1, q.push(c);
return;
}
void bfs()
{
while (!q.empty())
{
t = q.front(), q.pop(), nx = t.x, ny = t.y;
if (nx == zx && ny == zy)
printf ("%lld\n", t.step), exit(0);
qj(), zw();
}
printf ("%lld\n", -1LL);
return;
}
第一个过不去的点:
6 7
0 0 0 0 0 0 0
0 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 0
1 1 1 6 E