这道题是要求两者相遇的时间。总共就四个方向,而且一个方向接着另一个方向,可以用一个子函数来求某一点的下一个位置,并用结构体将点坐标以及方向,是否变向存放起来。但是会有不相遇的情况,不相遇有多种情况,可以是两者会经过他们的初始点然后一直绕圈子,那就判断一下两者经过多次的绕圈是否会在同一时间经过他们的初始点;或者是不经过初始点进行绕圈,或者是像布朗运动一样乱走,但是两者就不相遇。所以最简单的方法就可以设置一个最大值,当时间一旦大于这个最大值,就认为两者不相遇。代码如下。
#include<bits/stdc++.h>
#define maxn 160000
using namespace std;
struct name{
int x;
int y;
int loca;
bool cha;
}name;
int ori[15][15];
struct name next(int x,int y,int loca){
struct name re;
re.cha=false;
re.x=x;
re.y=y;
re.loca=loca;
if (loca==1){
if ((ori[x-1][y])||x==1){
re.loca=2;
re.cha=true;
}
else re.x-=1;
}
else if (loca==2){
if ((ori[x][y+1])||y==10){
re.loca=3;
re.cha=true;
}
else re.y+=1;
}
else if (loca==3){
if ((ori[x+1][y]||x==10)){
re.loca=4;
re.cha=true;
}
else re.x+=1;
}
else {
if ((ori[x][y-1])||y==1){
re.loca=1;
re.cha=true;
}
else re.y-=1;
}
return re;
}
int main (){
freopen ("ttwo.in","r",stdin);
freopen ("ttwo.out","w",stdout);
struct name ansc;
struct name ansf;
ansc.loca=1;
ansc.cha=false;
ansf.loca=1;
ansf.cha=false;
memset(ori,0,sizeof(ori));
int xc=0,xf=0,yc=0,yf=0,cnt=0;
char in=' ';
for (int i=1;i<=10;i++){
for (int j=1;j<=10;j++){
cin>>in;
if (in=='*'){
ori[i][j]=1;
}
else if (in=='C'){
ansc.x=i;
ansc.y=j;
}
else if (in=='F'){
ansf.x=i;
ansf.y=j;
}
}
}
bool flag=false;
while (!flag){
ansc=next(ansc.x,ansc.y,ansc.loca);
ansf=next(ansf.x,ansf.y,ansf.loca);
if (ansc.x==ansf.x&&ansc.y==ansf.y){
cout<<(cnt+1)<<endl;
flag=true;
}
cnt++;
if (cnt>maxn){
cout<<0<<endl;
flag=true;
}
}
return 0;
}