AOJ2031 Hyper Rock-Scissors-Paper

問題リンク Hyper Rock-Scissors-Paper

  • 概要

15個の手があるじゃんけんをN人でやる。その中の勝つ手を答えよ。あいこで終わる場合はDrawとせよ。
N < 1000

  • 解法

勝敗関係の図をみると、反時計回りに番号を付け、x番の手で勝てるものはx+1〜x+7の手だとわかるのでfor文で勝敗がすぐ調べられます。また、勝つ手を調べれば良いだけなので入力にどの手が出現したかだけ覚え、出現した手の中で勝敗関係を調べるだけでいいです。「入力に登場した手」かつ「入力の他の手に負けない手」かつ「入力の他の手に勝つ手」を満たす手が答えです。

  • ソース
import java.util.Scanner;

//Hyper Rock-Scissors-Paper
public class AOJ2031 {

	void run(){
		Scanner sc = new Scanner(System.in);
		String[] s = {"Rock", "Fire", "Scissors", "Snake", "Human", "Tree", "Wolf", "Sponge", "Paper", "Air", "Water", "Dragon", "Devil", "Lightning", "Gun"};
		for(;;){
			int n = sc.nextInt();
			if(n==0)break;
			boolean[] u = new boolean[15];
			for(int i=0;i<n;i++){
				String t = sc.next();
				for(int j=0;j<15;j++)if(s[j].equals(t))u[j]=true;
			}
			boolean[] win = new boolean[15], lose = new boolean[15];
			for(int i=0;i<15;i++){
				if(!u[i])continue;
				for(int j=i+1;j<=i+7;j++){
					int k = j%15;
					if(!u[k])continue;
					lose[k] = true;
					win[i] = true;
				}
			}
			String res = "Draw";
			for(int i=0;i<15;i++)if(u[i]&&!lose[i]&&win[i])res=s[i];
			System.out.println(res);
		}
	}
	public static void main(String[] args) {
		new AOJ2031().run();
	}
}