南邮 OJ 1058 Tom and Jerry

Tom and Jerry

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 251            测试通过 : 98 

比赛描述

Tom和Jerry在10*10的方格中:
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......

C=Tom(猫)
M=Jerry(老鼠)
*=障碍物
.=空地

他们各自每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。注意,“对穿”是不算相遇的。
他们移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90度。一开始他们都面向北方。
编程计算多少秒以后他们相遇。



输入

10行,格式如上

输出

相遇时间T。如果无解,输出-1。

样例输入

*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......

样例输出

49

题目来源

wwm




#include<iostream>
#define NORTH 0 
#define EAST  1
#define SOUTH 2
#define WEST  3
using namespace std;
struct point{
	int i;
	int j;
	char dir;
};
int main(){
	point C,M;
	char c[10][10];
	int T=0;
	for(int i=0;i<10;++i){
		for(int j=0;j<10;++j){
			cin>>c[i][j];
			if(c[i][j] == 'C'){
				c[i][j] = '.';
				C.i = i;
				C.j = j;
				C.dir = NORTH;
			}else if(c[i][j] == 'M'){
				c[i][j] = '.';
				M.i = i;
				M.j = j;
				M.dir = NORTH;
			}			
		}
	}
	for(long i=0;i<10000;++i){
//		cout<<"step"<<T<<" M.i="<<M.i<<" M.j="<<M.j<<" M.dir="<<(int)M.dir<<" C.i="<<C.i<<" C.j="<<C.j<<" C.dir="<<(int)C.dir<<endl;
		if(C.i==M.i && C.j==M.j){
			cout<<T<<endl;
			return 0;
		}
		switch(C.dir){
			case NORTH:
				if(C.i>0 && c[C.i-1][C.j]=='.')
					--C.i;
				else
					C.dir = EAST;
				break;
			case EAST:
				if(C.j<9 && c[C.i][C.j+1]=='.')
					++C.j;
				else
					C.dir = SOUTH;
				break;
			case SOUTH:
				if(C.i<9 && c[C.i+1][C.j]=='.')
					++C.i;
				else
					C.dir = WEST;
				break;
			case WEST:
				if(C.j>0 && c[C.i][C.j-1]=='.')
					--C.j;
				else
					C.dir = NORTH;
				break;
		}
		switch(M.dir){
			case NORTH:
				if(M.i>0 && c[M.i-1][M.j]=='.')
					--M.i;
				else
					M.dir = EAST;
				break;
			case EAST:
				if(M.j<9 && c[M.i][M.j+1]=='.')
					++M.j;
				else
					M.dir = SOUTH;
				break;
			case SOUTH:
				if(M.i<9 && c[M.i+1][M.j]=='.')
					++M.i;
				else
					M.dir = WEST;
				break;
			case WEST:
				if(M.j>0 && c[M.i][M.j-1]=='.')
					--M.j;
				else
					M.dir = NORTH;
				break;
		}
		++T;
	}
	cout<<-1<<endl;
}






你可能感兴趣的:(ACM,and,tom,Jerry,南邮OJ)