尝试过判断坐标写成函数和break;形式,尝试过改大flag数组,尝试过判断死循环写在模拟移动操作前、后,也试过用C++11和C++14提交,都是在wsl(ubuntu 18.04)下得到答案但是交上去RE。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
int wm=1,wc=1,xm,ym,xc,yc,ans=0,tt=1;
bool rr(){
bool r=true;
if(xm == xc && ym == yc){
r=false;
}
return r;
}
int main(){
bool flag[200005],r=true;
for(int i=0;i<200005;i++) flag[i] = false;
char f[13][13];
for(int i=0;i<=11;i++){
f[0][i] = f[i][0] = f[11][i] = f[i][11] = '*';
}
for(int j=1;j<=10;j++){
for(int i=1;i<=10;i++){
std::cin>>f[i][j];
if(f[i][j] == 'F'){
xm = i;
ym = j;
}else if(f[i][j] == 'C'){
xc = i;
yc = j;
}
}
}
while(rr()){
tt = xm+ym*10+xc*100+yc*1000+wc*10000+wm*40000;
if(flag[tt]){
putchar('0');
putchar('\n');
return 0;
}
switch (wm){
case 1:
if(f[xm][ym-1] != '*') ym--;
else wm++;
break;
case -1:
if(f[xm][ym+1] != '*') ym++;
else wm--;
break;
case 2:
if(f[xm+1][ym] != '*') xm++;
else wm=-1;
break;
case -2:
if(f[xm-1][ym] != '*') xm--;
else wm=1;
break;
}
switch (wc){
case 1:
if(f[xc][yc-1] != '*') yc--;
else wc++;
break;
case -1:
if(f[xc][yc+1] != '*') yc++;
else wc--;
break;
case 2:
if(f[xc+1][yc] != '*') xc++;
else wc=-1;
break;
case -2:
if(f[xc-1][yc] != '*') xc--;
else wc=1;
break;
}
flag[tt] = true;
ans++;
}
printf("%d\n",ans);
return 0;
}