FJNU.1409
Description
猫和老鼠在10*10的方格中运动,例如:
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......
C=猫(CAT)
M=老鼠(MOUSE)
*=障碍物
.=空地
猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。
注意,“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90度。一开始他们都面向北方。
编程计算多少秒以后他们相遇。
Input
第一行为一整数N,表示有N组测试数据。
每组测试数据为10行,格式如题目描述。
Output
相遇时间T。如果无解,输出-1。
Sample Input
1
*...*.....
......*...
...*...*..
..........
...*.C....
*.....*...
...*......
..M......*
...*.*....
.*.*......
Sample Output
49
Source
oibh
My Program
#include
<
iostream
>
#define N 10
using namespace std;
int main()
... {
int i,j,k,n;
char map[N][N];
int cat_x,cat_y,cat_face;
int mouse_x,mouse_y,mouse_face;
int T;
cin>>n;
for(i=0;i<n;i++)
...{
T=0;
cat_face=mouse_face=1;
for(j=0;j<N;j++)
for(k=0;k<N;k++)
...{
cin>>map[j][k];
if(map[j][k]=='C')
...{
cat_x=k;
cat_y=j;
continue;
}
if(map[j][k]=='M')
...{
mouse_x=k;
mouse_y=j;
continue;
}
}
while(true)
...{
if(mouse_x==cat_x&&mouse_y==cat_y)
break;
T++;
switch(cat_face)
...{
case 1: // face to North (up)
if(cat_y!=0&&map[cat_y-1][cat_x]!='*')
cat_y--;
else
cat_face=2; // turn right (West)
break;
case 2: // face to West (right)
if(cat_x!=N-1&&map[cat_y][cat_x+1]!='*')
cat_x++;
else
cat_face=3; // turn right (South)
break;
case 3: // face to South (down)
if(cat_y!=N-1&&map[cat_y+1][cat_x]!='*')
cat_y++;
else
cat_face=4; // turn right (East)
break;
case 4: // face to East (left)
if(cat_x!=0&&map[cat_y][cat_x-1]!='*')
cat_x--;
else
cat_face=1; // turn right (North)
break;
}
switch(mouse_face)
...{
case 1: // face to North (up)
if(mouse_y!=0&&map[mouse_y-1][mouse_x]!='*')
mouse_y--;
else
mouse_face=2; // turn right (West)
break;
case 2: // face to West (right)
if(mouse_x!=N-1&&map[mouse_y][mouse_x+1]!='*')
mouse_x++;
else
mouse_face=3; // turn right (South)
break;
case 3: // face to South (down)
if(mouse_y!=N-1&&map[mouse_y+1][mouse_x]!='*')
mouse_y++;
else
mouse_face=4; // turn right (East)
break;
case 4: // face to East (left)
if(mouse_x!=0&&map[mouse_y][mouse_x-1]!='*')
mouse_x--;
else
mouse_face=1; // turn right (North)
break;
}
if(T>1000)
break;
}
if(T==0||T>1000)
cout<<-1<<endl;
else
cout<<T<<endl;
}
return 0;
}
#define N 10
using namespace std;
int main()
... {
int i,j,k,n;
char map[N][N];
int cat_x,cat_y,cat_face;
int mouse_x,mouse_y,mouse_face;
int T;
cin>>n;
for(i=0;i<n;i++)
...{
T=0;
cat_face=mouse_face=1;
for(j=0;j<N;j++)
for(k=0;k<N;k++)
...{
cin>>map[j][k];
if(map[j][k]=='C')
...{
cat_x=k;
cat_y=j;
continue;
}
if(map[j][k]=='M')
...{
mouse_x=k;
mouse_y=j;
continue;
}
}
while(true)
...{
if(mouse_x==cat_x&&mouse_y==cat_y)
break;
T++;
switch(cat_face)
...{
case 1: // face to North (up)
if(cat_y!=0&&map[cat_y-1][cat_x]!='*')
cat_y--;
else
cat_face=2; // turn right (West)
break;
case 2: // face to West (right)
if(cat_x!=N-1&&map[cat_y][cat_x+1]!='*')
cat_x++;
else
cat_face=3; // turn right (South)
break;
case 3: // face to South (down)
if(cat_y!=N-1&&map[cat_y+1][cat_x]!='*')
cat_y++;
else
cat_face=4; // turn right (East)
break;
case 4: // face to East (left)
if(cat_x!=0&&map[cat_y][cat_x-1]!='*')
cat_x--;
else
cat_face=1; // turn right (North)
break;
}
switch(mouse_face)
...{
case 1: // face to North (up)
if(mouse_y!=0&&map[mouse_y-1][mouse_x]!='*')
mouse_y--;
else
mouse_face=2; // turn right (West)
break;
case 2: // face to West (right)
if(mouse_x!=N-1&&map[mouse_y][mouse_x+1]!='*')
mouse_x++;
else
mouse_face=3; // turn right (South)
break;
case 3: // face to South (down)
if(mouse_y!=N-1&&map[mouse_y+1][mouse_x]!='*')
mouse_y++;
else
mouse_face=4; // turn right (East)
break;
case 4: // face to East (left)
if(mouse_x!=0&&map[mouse_y][mouse_x-1]!='*')
mouse_x--;
else
mouse_face=1; // turn right (North)
break;
}
if(T>1000)
break;
}
if(T==0||T>1000)
cout<<-1<<endl;
else
cout<<T<<endl;
}
return 0;
}
YOYO's Note:
当T>1000时可以判断无解。之前因为忘记了结果TLE = =
模拟一遍就好了。