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
KEY:我为了解题方便,在原图的四周,加上了‘ * ’这样就不怕出界了;
Source:
#include < iostream >
using namespace std;
int d1[ 4 ] = ... {-1,0,1,0} ;
int d2[ 4 ] = ... {0,1,0,-1} ;
char a[ 15 ][ 15 ];
struct node
... {
int x;
int y;
} ;
node C,M;
void init()
... {
int i,j;
for(i=0;i<=11;i++)
for(j=0;j<=11;j++)
a[i][j]='*';
}
void input()
... {
int i,j;
char c;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
...{
cin>>c;
if(c=='M')
...{
M.x=i;
M.y=j;
}
if(c=='C')
...{
C.x=i;
C.y=j;
}
a[i][j]=c;
}
}
int count()
... {
int T=0;
int c=0,m=0;
while( !(M.x==C.x&&M.y==C.y)&&T<=1000)
...{
if(a[M.x+d1[m]][M.y+d2[m]]!='*')
...{
M.x+=d1[m];
M.y+=d2[m];
}
else
...{
m++;
m=m%4;
}
if(a[C.x+d1[c]][C.y+d2[c]]!='*')
...{
C.x+=d1[c];
C.y+=d2[c];
}
else
...{
c++;
c=c%4;
}
T++;
}
if(T==0||T>1000) return -1;
else return T;
}
int main()
... {
// freopen("fjnu_1409.in","r",stdin);
int N;
cin>>N;
for(int i=1;i<=N;i++)
...{
init();
input();
cout<<count()<<endl;
}
return 0;
}
#include < iostream >
using namespace std;
int d1[ 4 ] = ... {-1,0,1,0} ;
int d2[ 4 ] = ... {0,1,0,-1} ;
char a[ 15 ][ 15 ];
struct node
... {
int x;
int y;
} ;
node C,M;
void init()
... {
int i,j;
for(i=0;i<=11;i++)
for(j=0;j<=11;j++)
a[i][j]='*';
}
void input()
... {
int i,j;
char c;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
...{
cin>>c;
if(c=='M')
...{
M.x=i;
M.y=j;
}
if(c=='C')
...{
C.x=i;
C.y=j;
}
a[i][j]=c;
}
}
int count()
... {
int T=0;
int c=0,m=0;
while( !(M.x==C.x&&M.y==C.y)&&T<=1000)
...{
if(a[M.x+d1[m]][M.y+d2[m]]!='*')
...{
M.x+=d1[m];
M.y+=d2[m];
}
else
...{
m++;
m=m%4;
}
if(a[C.x+d1[c]][C.y+d2[c]]!='*')
...{
C.x+=d1[c];
C.y+=d2[c];
}
else
...{
c++;
c=c%4;
}
T++;
}
if(T==0||T>1000) return -1;
else return T;
}
int main()
... {
// freopen("fjnu_1409.in","r",stdin);
int N;
cin>>N;
for(int i=1;i<=N;i++)
...{
init();
input();
cout<<count()<<endl;
}
return 0;
}