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");
			}
		}
	}

}