POJ 1573 Robot Motion模拟

   题目:http://poj.org/problem?id=1573

   题目大意:一个棋牌上布满了N,E,S,W指令,人从北边的一个初始列按照棋牌的指令开始移动。直到走出棋牌,或者出现循环为止。

                      N表示向北(上)移动一格,

                      E表示向东(右)移动一格,

                     S表示向南(下)移动一格,

                     W表示向西(左)移动一格

   分析:因为棋牌只有10*10,也就是最多只有100步而已,因此可以用模拟的算法。我们声明一个char的棋牌map用于记录指令,一个初始值为全0的棋牌用于记录走过的路径。进行模拟直到人走出棋牌或者发现path不为0了,证明出现了环。

   代码如下:

#include <stdio.h>
#include<string.h>

#define  ONLINE

void online()
{
#ifdef ONLINE
#else
	freopen("1573.in", "r", stdin);
	freopen("1573.out", "w", stdout);
#endif
}

const int LEN = 11;

int r, c, s;
char map[LEN][LEN];
int path[LEN][LEN];
int steps, loops;

//模拟
void imitate(int x, int y, int s)
{
	if (x <=0 || x > r || y <= 0 || y > c)
	{
		steps = s;
		loops = -1;
		return ;
	}
	if (path[x][y] != 0)
	{
		steps = path[x][y]-1;
		loops = s - steps;
		return;
	}

	path[x][y] = s +1;
	if (map[x][y] == 'N')
	{
		imitate(x-1, y, path[x][y]);
	}
	else if (map[x][y] == 'S')
	{
		imitate(x+1,y, path[x][y]);
	}
	else if (map[x][y] == 'W')
	{
		imitate(x, y-1, path[x][y]);
	}
	else if (map[x][y] == 'E')
	{
		imitate(x, y+1, path[x][y]);
	}
}

//打印
void print()
{
	if (loops == -1)
	{
		printf("%d step(s) to exit\n", steps);
	}
	else
		printf("%d step(s) before a loop of %d step(s)\n", steps, loops);
}

//读取数据
void read()
{
	while (true)
	{
		scanf("%d%d%d\n", &r, &c, &s);

		if (r==0 && c == 0 && s == 0)
		{
			break;
		}

		for(int i =1; i <= r; i ++)
		{
			for (int j=1; j <= c; j ++)
			{
				scanf("%c", &map[i][j]);
			}//end for j
			scanf("\n");
		}//end for i;

		memset(path, 0, LEN * LEN * sizeof(int));
		imitate(1, s, 0);
		print();
	}//end while 
}

int main()
{
	online();
	read();
	return 0;
}
    运行结果如下:

1573 Accepted 176K 0MS C++ 1423B 2011-08-02 22:36:30


你可能感兴趣的:(POJ 1573 Robot Motion模拟)