結果
問題 |
No.3199 Key-Door Grid
|
ユーザー |
|
提出日時 | 2025-07-11 23:34:37 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 177 ms / 3,000 ms |
コード長 | 1,738 bytes |
コンパイル時間 | 1,046 ms |
コンパイル使用メモリ | 93,404 KB |
実行使用メモリ | 21,760 KB |
最終ジャッジ日時 | 2025-07-11 23:34:42 |
合計ジャッジ時間 | 5,091 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:61:37: warning: ‘gi’ may be used uninitialized [-Wmaybe-uninitialized] 61 | for(int i=0; i<=m; i++) if(seen[gi][gj][i]>=0) ans=min(ans, seen[gi][gj][i]); | ^ main.cpp:14:15: note: ‘gi’ was declared here 14 | int si, sj, gi, gj; | ^~ main.cpp:61:41: warning: ‘gj’ may be used uninitialized [-Wmaybe-uninitialized] 61 | for(int i=0; i<=m; i++) if(seen[gi][gj][i]>=0) ans=min(ans, seen[gi][gj][i]); | ^ main.cpp:14:19: note: ‘gj’ was declared here 14 | int si, sj, gi, gj; | ^~
ソースコード
#include<iostream> #include<vector> #include<tuple> #include<queue> #include<algorithm> using namespace std; using ll = long long; using P = pair<int, int>; using tu = tuple<int, int, int, int>; int main(){ int h, w, m; cin >> h >> w >> m; vector<string> s(h); int si, sj, gi, gj; for(int i=0; i<h; i++){ cin >> s[i]; for(int j=0; j<w; j++){ if(s[i][j]=='S') si=i, sj=j; if(s[i][j]=='G') gi=i, gj=j; } } vector seen(h, vector<vector<int>>(w, vector<int>(m+1, -1))); queue<tu> bfs; bfs.emplace(si, sj, 0, m); int di[4]={-1, 0, 1, 0}; int dj[4]={0, 1, 0, -1}; while(bfs.size()){ auto [i, j, cnt, key]=bfs.front(); bfs.pop(); //cout << "? " << i << ' ' << j << ' ' << cnt << ' ' << key << endl; if(seen[i][j][key]!=-1) continue; seen[i][j][key]=cnt; for(int k=0; k<4; k++){ int ni=i+di[k], nj=j+dj[k]; if(ni<0||nj<0||ni>=h||nj>=w) continue; if(s[ni][nj]=='#') continue; //cout << "?? " << ni << ' ' << nj << ' ' << k << ' ' << s[ni][nj] << endl; char now=s[ni][nj]; if(now=='.'||now=='S'||now=='G'){ //cout << "?" << endl; if(seen[ni][nj][key]==-1){ bfs.emplace(ni, nj, cnt+1, key); continue; } else continue; } if(now-'1'>=0&&now-'1'<m){ if(seen[ni][nj][now-'1'==-1]){ bfs.emplace(ni, nj, cnt+1, now-'1'); } } else{ if(now-'a'==key){ if(seen[ni][nj][key]==-1){ bfs.emplace(ni, nj, cnt+1, key); } } } } } int ans=1e8; for(int i=0; i<=m; i++) if(seen[gi][gj][i]>=0) ans=min(ans, seen[gi][gj][i]); if(ans==1e8) cout << -1 << endl; else cout << ans << endl; return 0; }