結果
| 問題 |
No.2328 Build Walls
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-13 12:05:51 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 150 ms / 3,000 ms |
| コード長 | 1,439 bytes |
| コンパイル時間 | 2,472 ms |
| コンパイル使用メモリ | 207,596 KB |
| 最終ジャッジ日時 | 2025-02-12 05:33:51 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
vector<int> dx = {-1, -1, -1, 0, 0, 1, 1, 1};
vector<int> dy = {-1, 0, 1, -1, 1, -1, 0, 1};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int h, w; cin >> h >> w;
vector<vector<int>> a(h, vector<int>(w));
for(int i = 1; i < h - 1; i++){
for(int j = 0; j < w; j++){
cin >> a[i][j];
}
}
vector<vector<int>> res(h, vector<int>(w, INF));
using T = tuple<int, int, int>;
priority_queue<T, vector<T>, greater<T>> q;
for(int i = 1; i < h - 1; i++){
if(a[i][0] != -1){
q.emplace(a[i][0], i, 0);
res[i][0] = a[i][0];
}
}
while(q.size()){
auto [cost, x, y] = q.top();
q.pop();
if(cost > res[x][y]){
continue;
}
for(int i = 0; i < 8; i++){
int x2 = x + dx[i], y2 = y + dy[i];
if(1 <= x2 && x2 < h - 1 && 0 <= y2 && y2 < w){
if(a[x2][y2] == -1) continue;
if(res[x2][y2] > cost + a[x2][y2]){
res[x2][y2] = cost + a[x2][y2];
q.emplace(res[x2][y2], x2, y2);
}
}
}
}
int ans = INF;
for(int i = 1; i < h - 1; i++){
ans = min(ans, res[i][w - 1]);
}
if(ans == INF){
cout << -1 << endl;
}else{
cout << ans << endl;
}
}