关于本地运行通过然而OJ上RE了的情况
查看原帖
关于本地运行通过然而OJ上RE了的情况
584363
Shack8楼主2023/1/12 00:09

代码如下:

#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判断方向,qf结合用以模拟前进 w[0]w[1]数组用来记录F与C的坐标,其中w[0][0]指初始坐标,w[0][1]指现在坐标,C与F相同. l用来记录行走过的路径,判断是否重合,len存储周期用时(每一次回到原点的时间),t记录总共用时.


map中一个单元为11时,表示没有障碍物,回到原点以后停止len的增加,随后判断前进方向是否有障碍物,在坐标重合时输出t,在均回到原点以后判断周期用时是否相等,相等就代表不会碰上,随后判断路径是否重合,重合说明一定会碰上.


#5测试点数据本地通过,但是OJ上无法通过,RE了,使用在线IDE同样如此X﹏X有大佬能救一下吗

2023/1/12 00:09
加载中...