MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 1573

Posted on 2011-11-08 19:38  MDeath-Kid  阅读(211)  评论(0)    收藏  举报

模拟题目,没什么难度。

 

//MDK	1573	Accepted	216K	0MS	C++	2460B	2011-11-08 19:31:29
int n,m,ini;
char mat[MAXN][MAXN];
int vis[MAXN][MAXN];
int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int getgo(char c) {
	if(c == 'N') return 0;
	if(c == 'S') return 1;
	if(c == 'W') return 2;
	if(c == 'E') return 3;
}

int main() {
	FOPEN

	while(~SCFT(n,m,ini)) {
		if(!(n||m||ini)) break;
		F(i,n) SCFS(mat[i+1]+1);
		//PP(n+1,m+1,mat);
		SET(vis,0);
		F(i,n+2) vis[i][0] = -1,vis[i][m+1] = -1;
		F(i,m+2) vis[0][i] = -1,vis[n+1][i] = -1;
		//PP(n+2,m+2,vis);
		int flag = 0,step = 1,ans,rep;

		int now[2] = {1,ini};
		vis[now[0]][now[1]] = 1;
		while(flag == 0) {
			//PP(n+2,m+2,vis);
			step ++;
			int fo = getgo(mat[now[0]][now[1]]);
			//DB(fo);
			now[0] += go[fo][0];
			now[1] += go[fo][1];
			if(vis[now[0]][now[1]] != 0) {
				if(vis[now[0]][now[1]] == -1) {
					flag = 1;
					ans = step;

				} else {
					flag = 2;
					ans = vis[now[0]][now[1]];
					rep = step - vis[now[0]][now[1]];
				}
				break;
			}
			vis[now[0]][now[1]] = step;
		}
		ans --;
		if(flag == 1) {
			printf("%d step(s) to exit\n",ans);
		} else {
			printf("%d step(s) before a loop of %d step(s)\n",ans,rep);
		}
	}
}