面倒なシミュレーションの問題です。 A, B, C, D それぞれの国の人の座り方をシミュレートする関数、setLeft, setB, setC, setD を素直に作りました。 椅子の状態を保持する配列(ここでは配列C)の先頭と末尾に番兵として'X'などを入れておくと実装が楽になるかと思います。 setD で使う getDist(int p, int d) は、p 番目の椅子から d 方向 (正が右、負が左)への空席の数を返します。 問題原文にある、椅子のサイズは大きすぎると思うのですが・・・ミスプリントでしょうね(AOJでは修正されています)。 #include<iostream> using namespace std; #define rep(i,s,e) for ( int i = s; i <= e; i++ ) #define MAX 10000 #define INFTY