社区讨论
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 条回复,欢迎继续交流。
正在加载回复...