結果
| 問題 |
No.3121 Prime Dance
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-16 01:12:01 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 819 ms / 2,000 ms |
| コード長 | 3,116 bytes |
| コンパイル時間 | 7,951 ms |
| コンパイル使用メモリ | 299,936 KB |
| 実行使用メモリ | 206,960 KB |
| 最終ジャッジ日時 | 2025-04-16 01:13:35 |
| 合計ジャッジ時間 | 8,481 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int MAX_P = 4000;
int main() {
int H, W;
cin >> H >> W;
using ai2 = array<int, 2>;
ai2 S, G;
cin >> S[0] >> S[1];
cin >> G[0] >> G[1];
S[0]--, S[1]--;
G[0]--, G[1]--;
vector<string> C(H);
for (int i = 0; i < H; i++) cin >> C[i];
if (S[0] < G[0]) {
S[0] = H - 1 - S[0];
G[0] = H - 1 - G[0];
reverse(C.begin(), C.end());
}
if (S[1] < G[1]) {
S[1] = W - 1 - S[1];
G[1] = W - 1 - G[1];
for (auto &i : C) {
reverse(i.begin(), i.end());
}
}
int dx[] = {0, 1, 0, -1, 0};
int dy[] = {1, 0, -1, 0, 1};
vector L(H, vector(W, false));
auto move_ok = [&](int x, int y) {
if (x < 0 || x >= H || y < 0 || y >= W) return false;
return C[x][y] != '#';
};
for (int x = 0; x < H; x++) {
for (int y = 0; y < W; y++) {
for (int i = 0; i < 4; i++) {
if (move_ok(x, y) && move_ok(x + dx[i], y + dy[i]) &&
move_ok(x + dx[i + 1], y + dy[i + 1])) {
L[x][y] = 1;
}
}
}
}
vector dist(H, vector(W, vector(H * W * 2, ai2{(int)1e8, (int)1e8})));
dist[S[0]][S[1]][0][0] = 0;
using ai4 = array<int, 4>;
deque<ai4> bfs;
bfs.push_back(ai4{S[0], S[1], 0, 0});
while (bfs.size()) {
auto [x, y, a, l] = bfs.front();
bfs.pop_front();
int d = dist[x][y][a][l];
if (L[x][y] && dist[x][y][a][1] > d) {
dist[x][y][a][1] = d;
bfs.push_front(ai4{x, y, a, 1});
}
if (a + 1 < H * W * 2) {
// a
int x2 = x + 1, y2 = y;
if (move_ok(x2, y2) && dist[x2][y2][a + 1][l] > d) {
dist[x2][y2][a + 1][l] = d;
bfs.push_front(ai4{x2, y2, a + 1, l});
}
}
{
// b
int x2 = x - 1, y2 = y;
if (move_ok(x2, y2) && dist[x2][y2][a][l] > d) {
dist[x2][y2][a][l] = d;
bfs.push_front(ai4{x2, y2, a, l});
}
}
{
// c
int x2 = x, y2 = y + 1;
if (move_ok(x2, y2) && dist[x2][y2][a][l] > d + 1) {
dist[x2][y2][a][l] = d + 1;
bfs.push_back(ai4{x2, y2, a, l});
}
}
{
// d
int x2 = x, y2 = y - 1;
if (move_ok(x2, y2) && dist[x2][y2][a][l] > d) {
dist[x2][y2][a][l] = d;
bfs.push_front(ai4{x2, y2, a, l});
}
}
}
vector prime(MAX_P, true);
prime[0] = prime[1] = 0;
for (int i = 2; i < MAX_P; i++) {
if (!prime[i]) continue;
for (int j = i * i; j < MAX_P; j += i) {
prime[j] = 0;
}
}
vector pH(0, 0), pW(0, 0);
for (int i = 0; i + (S[0] - G[0]) < MAX_P; i++) {
if (prime[i] && prime[i + (S[0] - G[0])]) {
pH.push_back(i);
}
}
for (int i = 0; i + (S[1] - G[1]) < MAX_P; i++) {
if (prime[i] && prime[i + (S[1] - G[1])]) {
pW.push_back(i);
}
}
pH.push_back(1e8);
pW.push_back(1e8);
int ans = 1e8;
for (int a = 1; a < H * W * 2; a++) {
int c = dist[G[0]][G[1]][a][1];
int h = *lower_bound(pH.begin(), pH.end(), a);
int w = *lower_bound(pW.begin(), pW.end(), c);
ans = min(ans, h * 2 + (S[0] - G[0]) + w * 2 + (S[1] - G[1]));
}
cout << (ans == 1e8 ? -1 : ans) << '\n';
}