AOJ 0199 Chairs Where Demanding People Sit
問題
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で書いてる人もいるのに