結果
問題 | No.367 ナイトの転身 |
ユーザー | rapurasu |
提出日時 | 2016-07-28 17:11:06 |
言語 | C++11 (gcc 13.3.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,832 bytes |
コンパイル時間 | 2,231 ms |
コンパイル使用メモリ | 166,952 KB |
実行使用メモリ | 31,328 KB |
最終ジャッジ日時 | 2024-11-06 18:11:23 |
合計ジャッジ時間 | 5,661 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 7 ms
25,096 KB |
testcase_01 | AC | 7 ms
18,248 KB |
testcase_02 | AC | 8 ms
18,832 KB |
testcase_03 | AC | 7 ms
18,640 KB |
testcase_04 | AC | 7 ms
18,664 KB |
testcase_05 | AC | 7 ms
18,452 KB |
testcase_06 | AC | 8 ms
19,980 KB |
testcase_07 | AC | 8 ms
19,312 KB |
testcase_08 | AC | 7 ms
18,012 KB |
testcase_09 | AC | 7 ms
18,596 KB |
testcase_10 | TLE | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
ソースコード
#include<bits/stdc++.h> using namespace std; #define INF 1000000000 #define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++) #define MAX_V 500000 struct edge {int to,cost;}; typedef pair<int,int> P; //firstは最短距離,secondは頂点の番号 int V; vector<edge> G[MAX_V]; int d[MAX_V]; int H,W; int sx,sy; int gx,gy; int check[501][501]; int dp[2][501][501]; int ni_x[8]={-2,-1,1,2,-2,-1,1,2}; int ni_y[8]={1,2,2,1,-1,-2,-2,-1}; int bi_x[4]={-1,1,-1,1}; int bi_y[4]={1,1,-1,-1}; struct gli{ int cost; int c;//1ナイト0ミニビショップ int x; int y; }; bool operator <(const gli& g,const gli& g2){ return g.cost>g2.cost; } bool operator >(const gli& g,const gli& g2){ return g.cost<g2.cost; } bool check_range(int x,int y){ if(x<0||x>=H||y<0||y>=W)return false; return true; } void dijkstra(int x,int y){ priority_queue<gli,vector<gli>,greater<gli> > que; gli g1={0,1,x,y}; //gli g2={0,1,x,y}; dp[1][x][y]=0; que.push(g1); //que.push(g2); while(!que.empty()){ gli g=que.top();que.pop(); if(dp[g.c][g.x][g.y]<g.cost)continue; if(g.c==1){ REP(i,8){ int xx=ni_x[i]+g.x; int yy=ni_y[i]+g.y; int c=g.c; if(check_range(xx,yy)){ if(check[xx][yy]==1)c=1-c; if(dp[c][xx][yy]>g.cost+1){ dp[c][xx][yy]=g.cost+1; gli gg={g.cost+1,c,xx,yy}; que.push(gg); } } } }else{ REP(i,4){ int xx=bi_x[i]+g.x; int yy=bi_y[i]+g.y; int c=g.c; if(check_range(xx,yy)){ if(check[xx][yy]==1)c=1-c; if(dp[c][xx][yy]>g.cost+1){ dp[c][xx][yy]=g.cost+1; gli gg={g.cost+1,c,xx,yy}; que.push(gg); } } } } } } int main(){ cin>>H>>W; REP(i,H){ REP(j,W){ check[i][j]=0; } } REP(i,2){ REP(j,H){ REP(k,W){ dp[i][j][k]=INF; } } } REP(i,H){ string s; cin>>s; REP(j,W){ if(s[j]=='R'){ check[i][j]=1; } if(s[j]=='S'){ sx=i;sy=j; } if(s[j]=='G'){ gx=i;gy=j; } } } dijkstra(sx,sy); /* REP(i,2){ REP(j,H){ REP(k,W){ cout<<dp[i][j][k]<<" "; } cout<<endl; } cout<<endl; }*/ int ans=min(dp[0][gx][gy],dp[1][gx][gy]); if(ans==INF){ cout<<-1<<endl; }else{ cout<<ans<<endl; } }