結果
| 問題 |
No.367 ナイトの転身
|
| コンテスト | |
| ユーザー |
fiord
|
| 提出日時 | 2016-05-20 10:18:05 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 26 ms / 2,000 ms |
| コード長 | 2,207 bytes |
| コンパイル時間 | 1,718 ms |
| コンパイル使用メモリ | 72,536 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-06 11:10:05 |
| 合計ジャッジ時間 | 2,063 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
ソースコード
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <tuple>
#include <queue>
using namespace std;
int dp[2][500][500];
const int inf=1e9;
int nx[]={-2,-2,-1,-1,1,1,2,2};
int ny[]={1,-1,2,-2,2,-2,1,-1};
int bx[]={-1,-1,1,1};
int by[]={1,-1,1,-1};
int h,w;
bool isInField(int x,int y){
if(x<0 or w<=x) return false;
if(y<0 or h<=y) return false;
return true;
}
int main(){
cin>>h>>w;
vector<string> s(h);
int sx=0,sy=0;
int gx=0,gy=0;
for(int i=0;i<h;i++){
cin>>s[i];
for(int j=0;j<w;j++){
if(s[i][j]=='S'){
sx=j; sy=i;
}
else if(s[i][j]=='G'){
gx=j; gy=i;
}
}
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++) dp[0][i][j]=dp[1][i][j]=inf;
}
queue<tuple<int,int,int> > q;
dp[0][sy][sx]=0;
q.push(make_tuple(0,sx,sy));
while(!q.empty()){
auto it=q.front(); q.pop();
int mode=get<0>(it);
int x=get<1>(it);
int y=get<2>(it);
if(x==gx and y==gy){
cout<<dp[mode][y][x]<<endl;
return 0;
}
if(mode==0){
for(int i=0;i<8;i++){
int dx=x+nx[i];
int dy=y+ny[i];
int nextmode=mode;
if(!isInField(dx,dy)) continue;
if(s[dy][dx]=='R'){
nextmode^=1;
}
if(dp[nextmode][dy][dx]>dp[mode][y][x]+1){
dp[nextmode][dy][dx]=dp[mode][y][x]+1;
q.push(make_tuple(nextmode,dx,dy));
}
}
}
else{
for(int i=0;i<4;i++){
int dx=x+bx[i];
int dy=y+by[i];
int nextmode=mode;
if(!isInField(dx,dy)) continue;
if(s[dy][dx]=='R'){
nextmode^=1;
}
if(dp[nextmode][dy][dx]>dp[mode][y][x]+1){
dp[nextmode][dy][dx]=dp[mode][y][x]+1;
q.push(make_tuple(nextmode,dx,dy));
}
}
}
}
cout<<-1<<endl;
return 0;
}
fiord