代码如下:
#include <iostream>
using namespace std;
bool map[15][15],d[2],ch;
int f[2],q[4][2]={{-1,0},{0,1},{1,0},{0,-1}},w[2][2][2],l[2][110][110],len[2],t;
int main()
{
for(int i=1;i<11;i++)
for(int j=1;j<11;j++)
{
char c;
cin>>c;
if(c=='.') map[i][j]=1;
else if(c=='F')
{
l[0][0][0]=w[0][1][0]=w[0][0][0]=i;
l[0][0][1]=w[0][1][1]=w[0][0][1]=j;
map[i][j]=1;
}
else if(c=='C')
{
l[1][0][0]=w[1][1][0]=w[1][0][0]=i;
l[1][0][1]=w[1][1][1]=w[1][0][1]=j;
map[i][j]=1;
}
}
while(1)
{
if(!d[0]) len[0]++;
if(!d[1]) len[1]++;
t++;
if(map[w[0][1][0]+q[f[0]][0]][w[0][1][1]+q[f[0]][1]])
{
w[0][1][0]+=q[f[0]][0];
w[0][1][1]+=q[f[0]][1];
l[0][t][0]=w[0][1][0];
l[0][t][1]=w[0][1][1];
}
else f[0]=(f[0]+5)%4;
if(map[w[1][1][0]+q[f[1]][0]][w[1][1][1]+q[f[1]][1]])
{
w[1][1][0]+=q[f[1]][0];
w[1][1][1]+=q[f[1]][1];
l[1][t][0]=w[1][1][0];
l[1][t][1]=w[1][1][1];
}
else f[1]=(f[1]+5)%4;
if(w[0][1][0]==w[1][1][0]&&w[0][1][1]==w[1][1][1])
{
cout<<t<<endl;
return 0;
}
if(w[0][1][0]==w[0][0][0]&&w[0][1][1]==w[0][0][1]&&t!=1&&f[0]==0) d[0]=1;
if(w[1][1][0]==w[1][0][0]&&w[1][1][1]==w[1][0][1]&&t!=1&&f[1]==0) d[1]=1;
if(d[0]&&d[1])
{
if(len[0]==len[1])
{
cout<<0<<endl;
return 0;
}
else if(!ch)
{
for(int i=0;i<=len[0]&&!ch;i++)
for(int j=0;j<=len[1];j++)
if(l[0][i][0]==l[1][j][0]&&l[0][i][1]==l[1][i][1])
{
ch=1;
break;
}
if(!ch)
{
cout<<0<<endl;
return 0;
}
}
}
}
return 0;
}
使用map作为地图,d数组判断是否已经回到原点,ch确定路径是否重合.
使用f判断方向,q和f结合用以模拟前进
w[0]和w[1]数组用来记录F与C的坐标,其中w[0][0]指初始坐标,w[0][1]指现在坐标,C与F相同.
l用来记录行走过的路径,判断是否重合,len存储周期用时(每一次回到原点的时间),t记录总共用时.
map中一个单元为1时,表示没有障碍物,回到原点以后停止len的增加,随后判断前进方向是否有障碍物,在坐标重合时输出t,在均回到原点以后判断周期用时是否相等,相等就代表不会碰上,随后判断路径是否重合,重合说明一定会碰上.
#5测试点数据本地通过,但是OJ上无法通过,RE了,使用在线IDE同样如此X﹏X有大佬能救一下吗