求助!!!半百卡住了,和答案总相差一
查看原帖
求助!!!半百卡住了,和答案总相差一
93000
chenjiannan楼主2020/8/9 11:16

思路很简单,老老实实来也就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;
}
2020/8/9 11:16
加载中...