思路很简单,老老实实来也就500行不到吧
#include <bits/stdc++.h>
using namespace std;
struct by
{
int x,y,fx,step;
};
by q[100000];
char k;
int n,m,h,t = 1,bx,by,ex,ey,a[100][100],b[100][100],vis[100][100][4];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
{
cin >> a[i][j];
if (a[i][j] == 1)
{
b[i][j] = b[i][j + 1] = b[i + 1][j] = b[i + 1][j + 1] = 2;
for (int k = 0; k < 4; ++k)
vis[i][j][k] = vis[i][j + 1][k] = vis[i + 1][j][k] = vis[i + 1][j + 1][k] = 1;
}
}
cin >> bx >> by >> ex >> ey >> k;
q[1].x = bx;
q[1].y = by;
if (k == 'E')
q[1].fx = 0;
if (k == 'S')
q[1].fx = 1;
if (k == 'W')
q[1].fx = 2;
if (k == 'N')
q[1].fx = 3;
if (vis[bx][by][q[1].fx])
{
cout << -1 << endl;
return 0;
}
vis[bx][by][q[1].fx] = 1;
while (h < t)
{
h++;
int x = q[h].x,y = q[h].y;
if (q[h].fx == 0 && !vis[x][y + 1][0] && y + 1 <= m)
{
vis[x][y + 1][0] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 0;
q[t].x = x;
q[t].y = y + 1;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y][3])
{
vis[x][y][3] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 3;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y][1])
{
vis[x][y][1] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 1;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y + 1][3])
{
vis[x][y + 1][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y + 1;
}
if (!vis[x][y + 1][1])
{
vis[x][y + 1][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y + 1;
}
if (!vis[x][y + 2][0] && y + 2 <= m)
{
vis[x][y + 2][0] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 0;
q[t].x = x;
q[t].y = y + 2;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y + 2][3])
{
vis[x][y + 2][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y + 2;
}
if (!vis[x][y + 2][1])
{
vis[x][y + 2][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y + 2;
}
if (!vis[x][y + 3][0] && y + 3 <= m)
{
vis[x][y + 3][0] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 0;
q[t].x = x;
q[t].y = y + 3;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y + 3][3])
{
vis[x][y + 3][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y + 3;
}
if (!vis[x][y + 3][1])
{
vis[x][y + 3][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y + 3;
}
}
}
}
if (q[h].fx == 1 && !vis[x + 1][y][1] && x + 1 <= n)
{
vis[x + 1][y][1] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 1;
q[t].x = x + 1;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y][0])
{
vis[x][y][0] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 0;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y][2])
{
vis[x][y][2] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 2;
q[t].x = x;
q[t].y = y;
}
if (!vis[x + 1][y][0])
{
vis[x + 1][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x + 1;
q[t].y = y;
}
if (!vis[x + 1][y][2])
{
vis[x + 1][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x + 1;
q[t].y = y;
}
if (!vis[x + 2][y][1] && x + 2 <= n)
{
vis[x + 2][y][1] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 1;
q[t].x = x + 2;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x + 2][y][0])
{
vis[x + 2][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x + 2;
q[t].y = y;
}
if (!vis[x + 2][y][2])
{
vis[x + 2][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x + 2;
q[t].y = y;
}
if (!vis[x + 3][y][1] && x + 3 <= n)
{
vis[x + 3][y][1] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 1;
q[t].x = x + 3;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x + 3][y][0])
{
vis[x + 3][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x + 3;
q[t].y = y;
}
if (!vis[x + 3][y][2])
{
vis[x + 3][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x + 3;
q[t].y = y;
}
}
}
}
if (q[h].fx == 2 && !vis[x][y - 1][2] && y - 1 >= 0)
{
vis[x][y - 1][2] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 2;
q[t].x = x;
q[t].y = y - 1;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y][1])
{
vis[x][y][1] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 1;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y][3])
{
vis[x][y][3] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 3;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y - 1][1])
{
vis[x][y - 1][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y - 1;
}
if (!vis[x][y - 1][3])
{
vis[x][y - 1][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y - 1;
}
if (!vis[x][y - 2][2] && y - 2 >= 0)
{
vis[x][y - 2][2] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 2;
q[t].x = x;
q[t].y = y - 2;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y - 2][1])
{
vis[x][y - 2][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y - 2;
}
if (!vis[x][y - 2][3])
{
vis[x][y - 2][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y - 2;
}
if (!vis[x][y - 3][2] && y - 3 >= 0)
{
vis[x][y - 3][2] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 2;
q[t].x = x;
q[t].y = y - 3;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y - 3][1])
{
vis[x][y - 3][1] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 1;
q[t].x = x;
q[t].y = y - 3;
}
if (!vis[x][y - 3][3])
{
vis[x][y - 3][3] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 3;
q[t].x = x;
q[t].y = y - 3;
}
}
}
}
if (q[h].fx == 3 && !vis[x - 1][y][3] && x - 1 >= 0)
{
vis[x - 1][y][3] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 3;
q[t].x = x - 1;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x][y][2])
{
vis[x][y][2] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 2;
q[t].x = x;
q[t].y = y;
}
if (!vis[x][y][0])
{
vis[x][y][0] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 0;
q[t].x = x;
q[t].y = y;
}
if (!vis[x - 1][y][2])
{
vis[x - 1][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x - 1;
q[t].y = y;
}
if (!vis[x - 1][y][0])
{
vis[x - 1][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x - 1;
q[t].y = y;
}
if (!vis[x - 2][y][3] && x - 2 >= 0)
{
vis[x - 2][y][3] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 3;
q[t].x = x - 2;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x - 2][y][2])
{
vis[x - 2][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x - 2;
q[t].y = y;
}
if (!vis[x - 2][y][0])
{
vis[x - 2][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x - 2;
q[t].y = y;
}
if (!vis[x - 3][y][3] && x - 3 >= 0)
{
vis[x - 3][y][3] = 1;
q[++t].step = q[h].step + 1;
q[t].fx = 3;
q[t].x = x - 3;
q[t].y = y;
if (q[t].x == ex && q[t].y == ey)
{
cout << q[t].step;
return 0;
}
if (!vis[x - 3][y][2])
{
vis[x - 3][y][2] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 2;
q[t].x = x - 3;
q[t].y = y;
}
if (!vis[x - 3][y][0])
{
vis[x - 3][y][0] = 1;
q[++t].step = q[h].step + 2;
q[t].fx = 0;
q[t].x = x - 3;
q[t].y = y;
}
}
}
}
cout << endl;
cout << q[h].step + 1;
cout << endl;
for (int i = 0; i <= n; ++i)
{
for (int j = 0; j <= m; ++j)
{
if (b[i][j] == 2)
{
cout << 2 << " ";
continue;
}
if (vis[i][j][0] == 1 || vis[i][j][1] == 1 || vis[i][j][2] == 1 || vis[i][j][3] == 1)
cout << 1 << " ";
else
cout << 0 << " ";
}
cout << endl;
}
cout << endl;
}
cout << -1;
return 0;
}