社区讨论

请教大佬,尝试了很多种写法,wsl下也跑过了,还是RE

P1518[USACO2.4] 两只塔姆沃斯牛 The Tamworth Two参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lodhyz9n
此快照首次捕获于
2023/10/31 06:54
2 年前
此快照最后确认于
2023/11/06 22:10
2 年前
查看原帖
尝试过判断坐标写成函数和break;形式,尝试过改大flag数组,尝试过判断死循环写在模拟移动操作前、后,也试过用C++11和C++14提交,都是在wsl(ubuntu 18.04)下得到答案但是交上去RE
C
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...