0210-The Squares
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0210
シミュレーション問題だけど仕様を把握するのがとても大変。
import java.util.*; public class Main { public static int MAP[][]=new int[40][40]; public static int h,w; public static Scanner scanner=new Scanner(System.in); public static int dx,dy; public static int ddx,ddy; //向きの進む方向を求める public static void getFace(int W){ if(W=='E'){ dx=1;dy=0; } else if(W=='N'){ dx=0;dy=-1; } else if(W=='W'){ dx=-1;dy=0; } else if(W=='S'){ dx=0;dy=1; } } public static int getMuki(){ if(dx==1&&dy==0) return 'E'; if(dx==0&&dy==-1) return 'N'; if(dx==-1&&dy==0) return 'W'; if(dx==0&&dy==1) return 'S'; return 'W'; } //向きを変換する //0右 1前 2左 3後 public static void convertFace(int M){ if(M==0){ ddx=-dy;ddy=dx; } else if(M==1){ ddx=dx;ddy=dy; } else if(M==2){ ddx=dy;ddy=-dx; } else if(M==3){ ddx=-dx;ddy=-dy; } } //迷路の情報を入力する public static int INPUT(){ String t; w=scanner.nextInt();h=scanner.nextInt(); if(w==0)return -1; int x,y; for(y=0;y<h;y++){ t=scanner.next(); for(x=0;x<w;x++){ MAP[x][y]=t.charAt(x); } } return 0; } //迷路の中にいる人の数を数える public static int CountPerson(){ int x,y; int res=0; for(y=0;y<h;y++){ for(x=0;x<w;x++){ if(MAP[x][y]=='E')res++; if(MAP[x][y]=='N')res++; if(MAP[x][y]=='W')res++; if(MAP[x][y]=='S')res++; } } return res; } //迷路の中にいる人の向きを変更する //移動は行わない public static void ChangeFace(){ int x,y; int i; for(y=0;y<h;y++){ for(x=0;x<w;x++){ if(MAP[x][y]=='E'||MAP[x][y]=='N'||MAP[x][y]=='W'||MAP[x][y]=='S'){ getFace(MAP[x][y]); for(i=0;i<4;i++){ convertFace(i); if(MAP[x+ddx][y+ddy]=='.'||MAP[x+ddx][y+ddy]=='X'){ dx=ddx;dy=ddy; MAP[x][y]=getMuki(); break; } } } } } } //実際に移動を行う public static void MoveStart(){ int Moving[][]=new int[40][40]; int x,y; for(int i=0;i<40;i++){ for(int j=0;j<40;j++){ Moving[i][j]=0; } } for(y=0;y<h;y++){ for(x=0;x<w;x++){ if(MAP[x][y]=='.'||MAP[x][y]=='X'){ if(MAP[x+1][y]=='W'){ Moving[x+1][y]=1; } else if(y>0&&MAP[x][y-1]=='S'){ Moving[x][y-1]=1; } else if(x>0&&MAP[x-1][y]=='E'){ Moving[x-1][y]=1; } else if(MAP[x][y+1]=='N'){ Moving[x][y+1]=1; } } } } for(y=0;y<h;y++){ for(x=0;x<w;x++){ if(Moving[x][y]==1){ getFace(MAP[x][y]); if(MAP[dx+x][dy+y]=='X'){ MAP[x][y]='.'; } else { MAP[dx+x][dy+y]=MAP[x][y]; MAP[x][y]='.'; } } } } } public static void main(String[] args) { int i; for(;INPUT()==0;){ for(i=0;i<=180;i++){ if(CountPerson()==0){ System.out.println(i); break; } ChangeFace(); MoveStart(); } if(i==181){ System.out.println("NA"); } } } }