結果
| 問題 |
No.3199 Key-Door Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-11 22:43:13 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 126 ms / 3,000 ms |
| コード長 | 2,161 bytes |
| コンパイル時間 | 3,756 ms |
| コンパイル使用メモリ | 291,532 KB |
| 実行使用メモリ | 21,504 KB |
| 最終ジャッジ日時 | 2025-07-11 22:43:19 |
| 合計ジャッジ時間 | 6,365 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
コンパイルメッセージ
main.cpp: In function ‘void solve()’:
main.cpp:40:12: warning: ‘sx’ may be used uninitialized [-Wmaybe-uninitialized]
40 | dist[sx][sy][0]=0;
| ^
main.cpp:30:9: note: ‘sx’ was declared here
30 | int sx,sy;
| ^~
main.cpp:40:16: warning: ‘sy’ may be used uninitialized [-Wmaybe-uninitialized]
40 | dist[sx][sy][0]=0;
| ^
main.cpp:30:12: note: ‘sy’ was declared here
30 | int sx,sy;
| ^~
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, s, t) for (ll i = s; i < (ll)(t); i++)
#define rrep(i, s, t) for(ll i = (ll)(t) - 1; i >= (ll)(s); i--)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define TT template<typename T>
TT using vec = vector<T>;
template<class T1, class T2> bool chmin(T1 &x, T2 y) { return x > y ? (x = y, true) : false; }
template<class T1, class T2> bool chmax(T1 &x, T2 y) { return x < y ? (x = y, true) : false; }
struct io_setup {
io_setup() {
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
cout << fixed << setprecision(15);
}
} io_setup;
const int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
const int INF=1<<30;
void solve(){
int H,W,M;
cin>>H>>W>>M;
vector<string>S(H);
rep(i,0,H)cin>>S[i];
int sx,sy;
rep(i,0,H){
rep(j,0,W){
if(S[i][j]=='S'){
sx=i;
sy=j;
}
}
}
vector dist(H,vector(W,vector<int>(M+1,INF)));
dist[sx][sy][0]=0;
deque<tuple<int,int,int,int>>dq;
dq.push_back({dist[sx][sy][0],sx,sy,0});
while(dq.size()){
auto[cost,x,y,t]=dq.front();
dq.pop_front();
if(S[x][y]=='G'){
cout<<cost<<"\n";
return;
}
if(dist[x][y][t]<cost)continue;
if('1'<=S[x][y]&&S[x][y]<='9'){
if(chmin(dist[x][y][S[x][y]-'0'],cost)){
dq.push_front({dist[x][y][S[x][y]-'0'],x,y,S[x][y]-'0'});
}
if(S[x][y]-'0'!=t)continue;
}
rep(i,0,4){
int ex=x+dx[i],ey=y+dy[i];
if(!(0<=ex&&ex<H&&0<=ey&&ey<W))continue;
if(S[ex][ey]=='#')continue;
if('a'<=S[ex][ey]&&S[ex][ey]<='i'){
if(S[ex][ey]-'a'+1==t&&chmin(dist[ex][ey][t],cost+1)){
dq.push_back({dist[ex][ey][t],ex,ey,t});
}
}else{
if(chmin(dist[ex][ey][t],cost+1)){
dq.push_back({dist[ex][ey][t],ex,ey,t});
}
}
}
}
cout<<-1<<"\n";
}
int main() {
solve();
}