请问下大家为什么注释这里二维坐标转换到一维会WA?
查看原帖
请问下大家为什么注释这里二维坐标转换到一维会WA?
774482
wy22041X楼主2023/8/27 22:15
#include <cstring>
#include <iostream>
#include <queue>

using namespace std;

const int N = 20000;

int n, m;
int sx, sy, ex, ey;
char w[N];
bool look[N];
int dist[N];
int dx[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, 1, -1};

struct Ver
{
	int x, y;
};

bool check(int x, int y)
{
	int u = (x - 1) * m + y;
	return u >= 1 && u <= n * m && w[u] == 'O';
	// return x >= 1 && x <= n && y >= 1 && y <= m && w[u] == 'O';
}

void initLook()
{
	memset(look, false, sizeof look);
	look[(ex - 1) * m + ey] = true;
	for (int i = 0; i < 8; i ++)
	{
		int x = ex + dx[i];
		int y = ey + dy[i];
		while (check(x, y))
		{
			look[(x - 1) * m + y] = true;
			x += dx[i], y += dy[i];
		}
	}
}

void bfs()
{
	memset(dist, -1, sizeof dist);
	dist[(sx - 1) * m + sy] = 0;

	queue<Ver> q;
	q.push({sx, sy});
	while (q.size())
	{
		auto t = q.front();
		q.pop();

		if (look[(t.x - 1) * m + t.y]) 
		{
			printf("%d\n", dist[(t.x - 1) * m + t.y]);
			return;
		}
		for (int i = 0; i < 4; i ++)
		{
			int x = t.x + dx[i];
			int y = t.y + dy[i];
			
			if (check(x, y) && dist[(x - 1) * m + y] == -1)
			{
				dist[(x - 1) * m + y] = dist[(t.x - 1) * m + t.y] + 1;
				q.push({x, y});
			}
		}
	}
	printf("Poor Harry\n");
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			scanf(" %c", &w[(i - 1) * m + j]);
	while (~scanf("%d%d%d%d", &ex, &ey, &sx, &sy), sx || sy || ex || ey)
	{
		initLook();
		bfs();
	}
	return 0;
}
2023/8/27 22:15
加载中...