JAG 模擬地区予選 2011 A問題
解法
愚直にやるとO(L)で間に合わないのでループを見つける.
計算量は100*100*4なので間に合う.
実装(C++)
intとlong longを間違えていて1WA
#include <algorithm> #include <vector> #include <iostream> #include <set> #include <map> #include <stack> #include <queue> #include <deque> #include <iomanip> #include <functional> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <iterator> #include <sstream> using namespace std; #define REP(i,x) for(int i=0;i<(int)x;i++) #define FOR(it,x) for(__typeof(x.begin()) it=x.begin();it!=x;it++) int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; char d[4]={'E','S','W','N'}; typedef long long lli; char MAP[101][101]; lli dp[101][101][4]; int main() { lli W,H,L; while(cin>>H>>W>>L){ if(H==0)break; int sx,sy,sd; for(int i=0;i<H;i++){ string tmp; cin>>tmp; for(int j=0;j<W;j++){ if(tmp[j]!='.'&&tmp[j]!='#'){ for(int k=0;k<4;k++){ if(tmp[j]==d[k]){ sd=k;sx=j;sy=i; } } tmp[j]='.'; } MAP[j][i]=tmp[j]; } } memset(dp,-1,sizeof(dp)); bool ac=false; for(;L--;){ if(ac==false&&dp[sx][sy][sd]>=0){ L%=(dp[sx][sy][sd]-L); ac=true; } dp[sx][sy][sd]=L; int nx=sx+dx[sd],ny=sy+dy[sd]; if(nx>=0&&nx<W&&ny>=0&&ny<H&&MAP[nx][ny]!='#'){ sx=nx;sy=ny; }else{ L++; sd=(sd+1)%4; } } cout<<sy+1<<" "<<sx+1<<" "<<d[sd]<<endl; } return 0; }