猫捉老鼠 FZU - 1019

一只猫和一只老鼠在10*10的迷宫中。迷宫中的每个方格可以是空的,或者含有障碍。猫和老鼠可以进入任意一个空的方格中。当他们相遇时,猫和老鼠在同一个方格中。但是,无论猫或老鼠都不能进入有障碍的方格。我们可以用字符组成的二维数组表示迷宫,如下图所示。

老鼠在迷宫中按照一种固定的方式行走:每个时刻,老鼠都向它所面对的方向前进一格,这需要花费1秒时间。如果前方是一个障碍或者是迷宫的边界,它将花1秒的时间按顺时针方向转90度。

为了抓到老鼠,这只猫决定也按照与老鼠相同的行走方式行进。

猫和老鼠在每个单位时间内是同时行动的。因此,如果猫和老鼠在行进过程中“擦肩而过”,猫是无法捉到老鼠的。只有当猫和老鼠同时到达一个相同的格子时,猫才能捉住老鼠。 
初始时,猫和老鼠不会在同一个方格中。并且它们都面向北方。
你的任务是编一个程序,求出猫捉到老鼠的所花时间。

Input
输入数据的第一行n,表示输入数据的组数。 
每组数据由10行组成,每行10个字符,表示迷宫的地图以及猫和老鼠的初始位置。输入数据保证只有一只猫和一只老鼠。 
每组输入数据之后均有一个空行作为间隔。 
Output
对于每组给定的输入,输出一行仅含一个数,即猫捉到老鼠所花的时间。如果猫永远都无法抓到老鼠,则输出0。 
Sample Input
1
*...*.....
......*...
...*...*..
..........
...*.c....
*.....*...
...*......
..m......*
...*.*....

.*.*......

题解:模拟,判断走10000步有没有相遇就行了

#include"stdio.h"
#include"string.h"
#include"cstdio"
#include"algorithm"
using namespace std;
char Maze[15][15];
int directc,directm;
int X[4]={-1,0,1,0},Y[4]={0,1,0,-1};
struct Step
{
	int x,y;
};
Step C,M;
void movec()
{
	int nx,ny;
	nx=C.x+X[directc];
	ny=C.y+Y[directc];
	if(nx<0||nx>=10||ny<0||ny>=10||Maze[nx][ny]=='*')
	{//printf("___%d %d\n",nx,ny),
		directc=(directc+1)%4;
		return ;
	}
	C.x=nx;C.y=ny;
}
void movem()
{
	int nx,ny;
	nx=M.x+X[directm];
	ny=M.y+Y[directm];
	if(nx<0||nx>=10||ny<0||ny>=10||Maze[nx][ny]=='*')
	{
		directm=(directm+1)%4;
		return ; 
	}
	M.x=nx;M.y=ny;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			int i;
			directc=directm=0;
			for(i=0;i<10;i++)
			{
				getchar();
				scanf("%s",Maze[i]);
			}
			for(i=0;i<10;i++)
			{//printf("%s\n",Maze[i]);
				for(int j=0;j<10;j++)
				{
					if(Maze[i][j]=='c')
					{
						C.x=i;
						C.y=j;
					}
					if(Maze[i][j]=='m')
					{
						M.x=i;
						M.y=j;
					}
				}
			}//
			int t;
			for(t=0;t<=100000;t++)
			{//printf("%d\n",Maze[i]);
				if(C.x==M.x&&C.y==M.y)
				break;//printf("%d %d\n",C.x,C.y);
				movec();
				movem();	
			}		
			if(t>=100000)
			printf("0\n");
			else
			printf("%d\n",t);
		} 
	}
}


你可能感兴趣的:(猫捉老鼠 FZU - 1019)