HDU 1035 Robot Motion

题目:给一个地图,地图中的每一个点给出了要前进的方向,如果可以走出边境,输出步数,如果出现了环,就输出到达重合点的步数,和环走完环的步数。

思想:按照他的方向前进就行,必定都是规定好的,然后用一个二维数组保存一个点第一次到达的步数即可。

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int Row,Col,Ent;
char maze[15][15];
struct NODE{
	int x;
	int y;
	int steps;
};
int steps[15][15];
bool visit[15][15];
int main()
{
	while(~scanf("%d%d%d",&Row,&Col,&Ent) && Row){
		for(int i = 1;i <= Row; ++i){
			scanf("%s",maze[i] + 1);
		}
		memset(visit,false,sizeof(visit));
		memset(steps,0,sizeof(steps));
		struct NODE cur,nxt;
		queue<NODE>q;
		while(!q.empty()) q.pop();
		cur.x = 1;
		cur.y = Ent;
		cur.steps = 0;
		steps[cur.x][cur.y] = 0;
		visit[cur.x][cur.y] = true;
		q.push(cur);
		while(!q.empty()){
			cur = q.front();
			q.pop();
			if(maze[cur.x][cur.y] == 'N'){
				nxt.x = cur.x - 1;
				nxt.y = cur.y;
				nxt.steps = cur.steps + 1;
				if(!visit[nxt.x][nxt.y]){
					if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){
						steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1;
						visit[nxt.x][nxt.y] = true;
						q.push(nxt);
					}
					else 
					{
						printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1);
						break;
					}
				}
				else
				{
					printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]);
					break;
				}
			}
			else if(maze[cur.x][cur.y] == 'S'){
				nxt.x = cur.x + 1;
				nxt.y = cur.y;
				nxt.steps = cur.steps + 1;
				if(!visit[nxt.x][nxt.y]){
					if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){
						steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1;
						visit[nxt.x][nxt.y] = true;
						q.push(nxt);
					}
					else 
					{
						printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1);
						break;
					}
				}
				else
				{
					printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]);
					break;
				}
			}
			else if(maze[cur.x][cur.y] == 'E'){
				nxt.x = cur.x;
				nxt.y = cur.y + 1;
				nxt.steps = cur.steps + 1;
				if(!visit[nxt.x][nxt.y]){
					if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){
						steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1;
						visit[nxt.x][nxt.y] = true;
						q.push(nxt);
					}
					else 
					{
						printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1);
						break;
					}
				}
				else
				{
					printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]);
					break;
				}
			}
			else{
				nxt.x = cur.x;
				nxt.y = cur.y - 1;
				nxt.steps = cur.steps + 1;
				if(!visit[nxt.x][nxt.y]){
					if(nxt.x >= 1 && nxt.x <= Row && nxt.y >= 1 && nxt.y <= Col){
						steps[nxt.x][nxt.y] = steps[cur.x][cur.y] + 1;
						visit[nxt.x][nxt.y] = true;
						q.push(nxt);
					}
					else 
					{
						printf("%d step(s) to exit\n",steps[cur.x][cur.y] + 1);
						break;
					}
				}
				else
				{
					printf("%d step(s) before a loop of %d step(s)\n",steps[nxt.x][nxt.y],nxt.steps - steps[nxt.x][nxt.y]);
					break;
				}
			}
		} 
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/triple_wdf/article/details/80154417