40分求调
查看原帖
40分求调
1023371
SaierOscar楼主2024/1/21 00:33

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
2024/1/21 00:33
加载中...