結果
| 問題 | No.3599 Queen Moving Query |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-06-28 11:59:18 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 1,193 ms / 5,000 ms |
| + 529µs | |
| コード長 | 2,522 bytes |
| 記録 | |
| コンパイル時間 | 950 ms |
| コンパイル使用メモリ | 122,176 KB |
| 実行使用メモリ | 273,504 KB |
| 最終ジャッジ日時 | 2026-07-24 20:32:43 |
| 合計ジャッジ時間 | 16,888 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
#include <iostream>
#include <vector>
#include <tuple>
#include <deque>
#include <string>
using namespace std;
int main(){
int H, W, sx, sy;
cin >> H >> W >> sx >> sy;
sx--;
sy--;
vector<string> S(H);
for (int i = 0; i < H; i++){
cin >> S[i];
}
int Q;
cin >> Q;
vector<int> gx(Q);
vector<int> gy(Q);
vector<int> T(Q);
for (int i = 0; i < Q; i++){
cin >> gx[i] >> gy[i] >> T[i];
gx[i]--;
gy[i]--;
}
vector<int> dx = {1, 1, 0, -1, -1, -1, 0, 1};
vector<int> dy = {0, 1, 1, 1, 0, -1, -1, -1};
bool movable = false;
for (int i = 0; i < 8; i++){
if (sx + dx[i] >= 0 && sx + dx[i] < H && sy + dy[i] >= 0 && sy + dy[i] < W){
if (S[sx + dx[i]][sy + dy[i]] == '.'){
movable = true;
}
}
}
if (!movable){
for (int i = 0; i < Q; i++){
cout << "No" << endl;
}
return 0;
}
const int INF = 1000000007;
vector<vector<vector<vector<int>>>> dist(H, vector<vector<vector<int>>>(W, vector<vector<int>>(9, vector<int>(2, INF))));
vector<vector<vector<vector<bool>>>> isvisited(H, vector<vector<vector<bool>>>(W, vector<vector<bool>>(9, vector<bool>(2, false))));
deque<tuple<int, int, int, int>> dq;
dq.push_front(make_tuple(sx, sy, 8, 0));
dist[sx][sy][8][0] = 0;
while (dq.size()){
auto tp = dq.front();
dq.pop_front();
int px = get<0>(tp);
int py = get<1>(tp);
int dir = get<2>(tp);
int id = get<3>(tp);
if (isvisited[px][py][dir][id]){
continue;
}
isvisited[px][py][dir][id] = true;
for (int i = 0; i < 8; i++){
int nx = px + dx[i];
int ny = py + dy[i];
if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
if (S[nx][ny] == '#') continue;
if (i == dir){
dq.push_front(make_tuple(nx, ny, i, id));
dist[nx][ny][i][id] = min(dist[nx][ny][i][id], dist[px][py][dir][id]);
}
dq.push_back(make_tuple(nx, ny, i, (id ^ 1)));
dist[nx][ny][i][id ^ 1] = min(dist[nx][ny][i][id ^ 1], dist[px][py][dir][id] + 1);
}
}
for (int i = 0; i < Q; i++){
int min_d = INF;
for (int j = 0; j < 8; j++){
min_d = min(min_d, dist[gx[i]][gy[i]][j][T[i] % 2]);
}
if (min_d <= T[i]) cout << "Yes" << endl;
else cout << "No" << endl;
}
}