AOJ0199 Chairs Where Demanding People Sit

問題リンク Chairs Where Demanding People Sit

  • 解法

シミュレート問題です。
椅子の状態を管理しておき、A〜Dの人に対応した座らせ方を実装します。

  • ソース
import java.util.Arrays;
import java.util.Scanner;

//Chairs Where Demanding People Sit
public class AOJ0199 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			int m = sc.nextInt();
			if((n|m)==0)break;
			char[] c = new char[n];
			Arrays.fill(c, '#');
			while(m--!=0){
				char p = sc.next().charAt(0);
				if(p=='A'){
					for(int i=0;i<n;i++)if(c[i]=='#'){c[i]=p;break;}
				}
				else if(p=='B'){
					boolean f = false;
					for(int i=n-1;i>=0;i--){
						if(c[i]=='#'){
							boolean r = i==n-1 || c[i+1]!='A';
							boolean l = i==0 || c[i-1]!='A';
							if(r&&l){
								f = true;
								c[i] = p;
								break;
							}
						}
					}
					if(f)continue;
					for(int i=0;i<n;i++)if(c[i]=='#'){c[i]=p;break;}
				}
				else if(p=='C'){
					boolean f = false;
					for(int i=0;i<n;i++){
						if(c[i]!='#'){
							if(i+1<n && c[i+1]=='#'){
								f = true;
								c[i+1]=p;
								break;
							}
							if(i>0 && c[i-1]=='#'){
								f = true;
								c[i-1]=p;
								break;
							}
						}
					}
					if(f)continue;
					int x = n%2==0?(n/2):((n+1)/2-1);
					c[x] = p;
				}
				else {
					boolean f = true;
					int[] l = new int[n];
					for(int i=0;i<n;i++){
						if(c[i]=='#'){
							if(i==0)l[i]=100;
							else l[i]=l[i-1]+1;
						}
						else {
							l[i] = 0;
							f = false;
						}
					}
					int[] r = new int[n];
					for(int i=n-1;i>=0;i--){
						if(c[i]=='#'){
							if(i==n-1)r[i]=100;
							else r[i]=r[i+1]+1;
						}
						else{ 
							r[i]=0;
							f = false;
						}
					}
					if(f){
						c[0]=p;
						continue;
					}
					int x = 0;
					int max = Math.min(Math.min(100, r[0]), Math.min(100, l[0]));
					for(int i=0;i<n;i++){
						int d = Math.min(Math.min(100, r[i]), Math.min(100, l[i]));
						if(max < d){
							max = d;
							x = i;
						}
					}
					c[x] = p;
				}
			}
			System.out.println(new String(c));
		}
	}
}