社区讨论

P2199最后的迷宫28分求助

P2199最后的迷宫参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo1ttvs8
此快照首次捕获于
2023/10/23 02:53
2 年前
此快照最后确认于
2023/11/03 03:26
2 年前
查看原帖
CPP
#include <iostream>
#include <queue>
using namespace std;

int n, m, b, c, d, e;
char a[16400];
bool vis[16400];

struct stu
{
	int x, y, s;
};
queue<stu> q;

int dx[10] = {1,1,-1,1,0,-1,0,-1}, dy[10] = {0,1,0,-1,1,1,-1,-1};

bool check(int x, int y)
{
	for (int i = 0; i < 8; i++)
	{
		int x1 = dx[i] + x, y1 = dy[i] + y;
		while (x1 >= 1 && x1 <= n && y1 >= 1 && y1 <= m && a[((x1 - 1) * m + y1)] != 'X')
		{
			if (x1 == d && y1 == e)  return true;
			x1 += dx[i];
			y1 += dy[i];
		}
	}
	return false;
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n * m; i++)
	{
		cin >> a[i];
	}	
	while (true)
	{
		cin >> b >> c >> d >> e;
		if (b == 0 && c == 0 && d == 0 && e == 0)  return 0;
		while (!q.empty())  q.pop();
		for (int i = 1; i <= 16384; i++)  vis[i] = 0;
		q.push({b, c, 0});
		vis[(b - 1) * m + c] = 1;
		bool flag = true;
		while (!q.empty())
		{
			stu now = q.front();
			q.pop();
			if (now.x == d && now.y == e || check(now.x, now.y))
			{
				cout << now.s << endl;
				flag = false;
				break;
			}
			for (int i = 0; i < 8; i += 2)
			{
				if (now.x + dx[i] < 1 || now.x + dx[i] > n || now.y + dy[i] < 1 || now.y + dy[i] > m || a[(now.x + dx[i] - 1) * m + now.y + dy[i]] == 'X' || vis[(now.x + dx[i] - 1) * m + now.y + dy[i]])  continue;
				q.push({now.x + dx[i], now.y + dy[i], now.s + 1});
				vis[(now.x + dx[i] - 1) * m + now.y + dy[i]] = 1;
			}
		}
		if (flag)  cout << "Poor Harry" << endl;
	}
	return 0;
}=

回复

2 条回复,欢迎继续交流。

正在加载回复...