結果
| 問題 |
No.3199 Key-Door Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-11 23:20:51 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 89 ms / 3,000 ms |
| コード長 | 1,933 bytes |
| コンパイル時間 | 2,221 ms |
| コンパイル使用メモリ | 208,816 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-07-11 23:20:56 |
| 合計ジャッジ時間 | 4,878 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
#ifndef INCLUDED_MAIN
#define INCLUDED_MAIN
#include __FILE__
int main(void){
ll h,w,m;cin>>h>>w>>m;
vector<vc> g(h,vc(w));
pair<int,int> s,goal;
rep(i,h)rep(j,w){
cin>>g[i][j];
if(g[i][j]=='S') s={i,j};
if(g[i][j]=='G') goal={i,j};
}
struct node{
int i;
int j;
int keyty;
};
vector<vector<array<bool,10>>> seen(h,vector<array<bool,10>>(w));
seen[s.first][s.second][0]=1;
vector<node> cur,nxt;
cur.reserve(h*w);nxt.reserve(h*w);
cur.push_back({s.first,s.second,0});
int depth=0;
while(cur.size()){
for(auto &nd : cur){
if(nd.i==goal.first && nd.j==goal.second){
cout<<depth<<nl;
return 0;
}
rep(d,4){
int ni=nd.i+dx[d],nj=nd.j+dy[d];
if(!isin(ni,nj,h,w) || g[ni][nj]=='#')continue;
int kty=nd.keyty;
char c=g[ni][nj];
if(c>='a'&&c<='i'){
int door=c-'a'+1;
if(door!=kty)continue;
}
if(c>='1'&&c<='9')kty=c-'0';
if(!seen[ni][nj][kty]){
seen[ni][nj][kty]=1;
nxt.push_back({ni,nj,kty});
}
}
}
cur.clear();
swap(cur,nxt);
depth++;
}
cout<<-1<<nl;
return 0;
}
/////// library zone ///////
#else
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(ll i=0;i<n;i++)
#define srep(i,l,r) for(ll i=l;i<=r;i++)
#define irep(i,r,l) for(ll i=r;i>=l;i--)
using ll = long long;
using ld = long double;
const ll mod=998244353;
#define nl "\n"
#define vl vector<ll>
#define vc vector<char>
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
vector<ll> dx={-1,1,0,0},dy={0,0,-1,1};
bool isin(ll i,ll j,ll h,ll w){
return i>=0&&i<h&&j>=0&&j<w;
}
#endif