結果
| 問題 |
No.2855 Move on Grid
|
| コンテスト | |
| ユーザー |
soumat
|
| 提出日時 | 2024-08-25 14:16:31 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 218 ms / 3,000 ms |
| コード長 | 1,616 bytes |
| コンパイル時間 | 2,219 ms |
| コンパイル使用メモリ | 209,856 KB |
| 最終ジャッジ日時 | 2025-02-24 01:07:36 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n,m,k;
vector<vector<int>> a;
bool func(int X) {
// 01bfs
deque<tuple<int,int,int>> dq;
vector<vector<int>> dp(n,vector<int>(m,INT_MAX));
dq.push_back({0,0,a[0][0] < X});
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
while (!dq.empty()) {
auto [x,y,z] = dq.front();
dq.pop_front();
if (dp[x][y] != INT_MAX) continue;
dp[x][y] = z;
for (int l = 0; l < 4; l++) {
int nx = x + dx[l];
int ny = y + dy[l];
if (nx < 0 || nx >= n) continue;
if (ny < 0 || ny >= m) continue;
if (dp[nx][ny] != INT_MAX) continue;
int t = a[nx][ny] < X;
if (t) dq.push_back({nx,ny,z+1});
else dq.push_front({nx,ny,z});
}
}
return dp[n-1][m-1] <= k;
}
int main(void) {
cin >> n >> m >> k;
// k >= n+mなら、経路全てを1e9に置き換えればよい
a.resize(n,vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
if (k >= n+m) {
int ans = 1e9;
cout << ans << endl;
return 0;
}
// k個1e9に置き換えて良い
// 最短距離で良いのか?
// 二分探索
// x以上に出来るか?
int ng = 0, ok = 1e9+1;
while (ng+1 != ok) {
int md = (ng+ok)/2;
if (!func(md)) {
ok = md;
}
else {
ng = md;
}
}
cout << ng << endl;
return 0;
}
soumat