読者です 読者をやめる 読者になる 読者になる

AOJ 0199 Chairs Where Demanding People Sit

Simulation Algorithms C/C++ AOJ

問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0199

解法

シュミレーション問題です。 Cの座る条件をいくつか見逃していてWA連発。 『How to Solve It』に問題を理解することって書いてあったのに。 ちゃんと問題を読むようにします

コード

int n, m, f, dis, pos;
char c[100];

int main(){
  while(scanf("%d%d", &n, &m) && n){
    rep(i, n) c[i] = '#';
    char p[2];
    rep(k, m){
      scanf("%s", p);
      switch(p[0]){
      case 'A':
    rep(i, n) if(c[i] == '#'){ c[i] = 'A'; break;;}
    break;
      case 'B':
    if(c[n-2] != 'A' && c[n-1] == '#'){ c[n-1] = 'B'; break;}
    for(int i = n-2; i > 0; i--) if(c[i+1] != 'A' && c[i-1] != 'A' && c[i] == '#'){ c[i] = 'B'; goto e1;}
    if(c[1] != 'A' && c[0] == '#'){ c[0] = 'B'; break;}
    rep(i, n) if(c[i] == '#'){ c[i] = 'B'; break;}
      e1:
    break;
      case 'C':
    rep(i, n) if(c[i] != '#'){
      if(i+1 < n && c[i+1] == '#'){ c[i+1] = 'C'; goto e2;}
      else if(i-1 >= 0 && c[i-1] == '#'){ c[i-1] = 'C'; goto e2;}
    }

    if(n%2) c[(n+1)/2-1] = 'C';
    else c[n/2] = 'C';
      e2:
    break;
      case 'D':
    dis = 0, pos = 0;
    rep(i, n){
      if(c[i] != '#') continue;
      int j;
      f = 0;
      for(j = 1; j < n; j++){
        if(i-j >= 0 && c[i-j] != '#') f = 1;
        if(i+j < n && c[i+j] != '#') f = 1;
        if(f){
          if(dis < j){
        dis = j;
        pos = i;
          }
          break;
        }
          }
    }

    c[pos] = 'D';
    break;
      }
    }
  
    rep(i, n) putchar(c[i]); puts("");
  }
  return 0;
}

A以外の時の処理が長い。800byteで書いてる人もいるのに