Problem:
Problem C: ラミー

あなたの友達は最近 UT-Rummy というカードゲームを思いついた．

このゲームで使うカードには赤・緑・青のいずれかの色と1から9までのいずれかの番号が
つけられている．
このゲームのプレイヤーはそれぞれ9枚の手札を持ち，
自分のターンに手札から1枚選んで捨てて，
代わりに山札から1枚引いてくるということを繰り返す．
このように順番にターンを進めていき，
最初に手持ちのカードに3枚ずつ3つの「セット」を作ったプレイヤーが勝ちとなる．
セットとは，同じ色の3枚のカードからなる組で，すべて同じ数を持っているか
連番をなしているもののことを言う．
連番に関しては，番号の巡回は認められない．
例えば，7, 8, 9は連番であるが 9, 1, 2は連番ではない．

あなたの友達はこのゲームをコンピュータゲームとして売り出すという計画を立てて，
その一環としてあなたに勝利条件の判定部分を作成して欲しいと頼んできた．
あなたの仕事は，手札が勝利条件を満たしているかどうかを判定する
プログラムを書くことである．

Input

入力の1行目にはデータセット数を表す数 T
(0 < T ≤ 50) が与えられる．
この行に引き続き T 個のデータセットが与えられる．

各データセットは2行からなり，
1行目には i 番目
(i = 1, 2, ..., 9)
のカードの数字 ni
がそれぞれスペースで区切られて与えられ，
2行目には i 番目のカードの色を表す文字
ci
がそれぞれスペースで区切られて与えられる．
カードの数字
ni
は 1 ≤ ni ≤ 9
を満たす整数であり，
カードの色 ci
はそれぞれ “R”, “G”,
“B”
のいずれかの文字である．

1つのデータセット内に色と数字がともに同じカードが5枚以上出現することはない．

Output

各データセットにつき，勝利条件を満たしていれば
“1”，
そうでなければ “0” と出力せよ．

Sample Input

5
1 2 3 3 4 5 7 7 7
R R R R R R G G G
1 2 2 3 4 4 4 4 5
R R R R R R R R R
1 2 3 4 4 4 5 5 5
R R B R R R R R R
1 1 1 3 4 5 6 6 6
R R B G G G R R R
2 2 2 3 3 3 1 1 1
R G B R G B R G B

Output for the Sample Input

1
0
0
0
1

Solution in JAVA (judge verdict: Accepted)



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/**
 * <pre>
 *	AOJ Rummy?????????????????????????????????????????????????????°
 * </pre>
 *
 * @author ??????
 * @category AOJRummy
 * @version 1.8_45
 * @since 1.8_45
 */
public class Main{

	/**
	 * ????????°???????????¨?????????????????????
	 */
	public static void main(String[] args) throws NumberFormatException, IOException {

		// ??????????????????
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// ????????????????????°
		int card_huda = 9;

		// 1??????????????????set?????°??????????????°
		int set = Integer.parseInt(br.readLine());

		// for????????? set????????°?????????
		for (int cnt1 = 0; cnt1 < set; cnt1++) {

			/**
			 * ???????????????????????????
			 *
			 * @param cardArr
			 *            ????????????????´???´???
			 */
			ArrayList<UTRummyCard> cardArr = new ArrayList<UTRummyCard>();

			/**
			 * ??\??????????§£?????°??????????????¨???????´?
			 *
			 * @param transNum
			 *            ??°???????????±???????´???´???
			 * @param transColor
			 *            ???????????±???????´???´???
			 */
			// ??????????????°??????????????????
			String[] transNum = br.readLine().split(" ");
			// ??????????????????????????????
			String[] transColor = br.readLine().split(" ");

			// ?????????????????°?????????
			for (int cnt2 = 0; cnt2 < card_huda; cnt2++) {
				// ????????????????????¨??¶???????????????
				boolean tool = false;
				// ????´??????????????????????????????????????????????
				// ?????????????¨?????????????????????\
				cardArr.add(new UTRummyCard(Integer.parseInt(transNum[cnt2]), transColor[cnt2], tool));
			}

			/**
			 * ????????? : ???????????¶??????????????°??? ????????????????????°0
			 *
			 * ????????????????¨??????????????????????
			 */
			utRummyGame(cardArr);
		}
	}// ?????????????????????????????????

	/**
	 * ????????????????????´??? ??????????¨? 3) ???????????????
	 */
	private static void utRummyGame(ArrayList<UTRummyCard> cardArr) {

		// ?????????????????\?????°????????????????????????R, G, B????????°????????????
		card_NumAndColor_Sort(cardArr);

		// ?????£?¶??????????????????°???3??????????¨?
		victoryCondition_Inspection(cardArr);

		// ???????????????
		outputAnswer(cardArr);

	}// utRummy????????????????????????

	private static void outputAnswer(ArrayList<UTRummyCard> cardArr) {
		// ???????????????????????????????¢????
		int tool_wasused = 0;
		for (int cnt = 0; cnt < cardArr.size(); cnt++) {
			if (cardArr.get(cnt).isUse() == false) {
				tool_wasused++;
			}
		}
		/**
		 * ????????????????????§???????????????????????¶???????????????????????¨????¨?
		 *
		 **** ?????????????????§???????¨?????????????
		 *
		 * int victory_or_defeat = 0;
		 *
		 * System.out.println(victory_or_defeat = (tool_wasused == 0)? 1:0);
		 */
		if (tool_wasused == 0) {
			// ??????????????¨??¶?????????????????£?????????????????¶????????????
			int victoryAnswer = 1;
			System.out.println(victoryAnswer);
		} else {
			// ????????????????????????????????¨?????¶??????????????????
			int defeatAnswer = 0;
			System.out.println(defeatAnswer);
		}
	}// outputAnswer????????????????????????

	/**
	 * ???????????¶?????????????´???¨???????????????????±?????????????????????¨
	 *
	 * @param cardArr
	 *            ????¨?????±????????????????
	 */
	private static void victoryCondition_Inspection(ArrayList<UTRummyCard> cardArr) {

		// ????????????????????????3?????????????????¢??????
		for (int cnt1 = 0; cnt1 < cardArr.size() - 2; cnt1++) {
			for (int cnt2 = cnt1 + 1; cnt2 < cardArr.size() - 1; cnt2++) {
				for (int cnt3 = cnt2 + 1; cnt3 < cardArr.size(); cnt3++) {

					// (1)????¨????????????????
					if (cardArr.get(cnt1).isUse() == false && cardArr.get(cnt2).isUse() == false
							&& cardArr.get(cnt3).isUse() == false) {
						// (2)???????????§?????????
						if (cardArr.get(cnt1).getRearColor().equals(cardArr.get(cnt2).getRearColor())
								&& cardArr.get(cnt2).getRearColor().equals(cardArr.get(cnt3).getRearColor())) {
							// (3)?????£?¶??????°????????????????????°???3?????§?????????
							if (cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt2).getFrontnumber() - 1
									&& cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt3).getFrontnumber() - 2
									|| cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt2).getFrontnumber()
											&& cardArr.get(cnt2).getFrontnumber() == cardArr.get(cnt3)
													.getFrontnumber()) {

								// ????????????????????????????????§???????????????
								for (int tool_btn = 0; tool_btn < cardArr.size(); tool_btn++) {
									if (cardArr.get(tool_btn) == cardArr.get(cnt1)
											|| cardArr.get(tool_btn) == cardArr.get(cnt2)
											|| cardArr.get(tool_btn) == cardArr.get(cnt3)) {
										// ????????§?¨??????????????????????????????????????????¨????????¶???????????´???
										cardArr.get(tool_btn).setUse(true);
									}
								}
							}
						}
					}
				}
			}
		}
	}// victoryCondition_Inspection????????????????????????

	/**
	 * ??????????????°?????\????????\??´??????
	 *
	 * ??????R, G, B????????°????????????
	 *
	 * @param cardArr
	 *            ??´???????±????????????????
	 */
	private static void card_NumAndColor_Sort(ArrayList<UTRummyCard> cardArr) {

		for (int cnt1 = 0; cnt1 < cardArr.size() - 1; cnt1++) {
			for (int cnt2 = 0; cnt2 < cardArr.size() - 1 - cnt1; cnt2++) {
				if (cardArr.get(cnt2).getFrontnumber() > cardArr.get(cnt2 + 1).getFrontnumber() || cardArr.get(cnt2)
						.getRearColor().charAt(0) < cardArr.get(cnt2 + 1).getRearColor().charAt(0)) {
					// ???????????????????????°
					UTRummyCard tmp_card = cardArr.get(cnt2);
					cardArr.set(cnt2, cardArr.get(cnt2 + 1));
					cardArr.set(cnt2 + 1, tmp_card);
				}
			}
		}
	}// card_NumAndColor_Sort????????????????????????

}// Rummy4?????????????????????

/**
 * ?????????????????? ????????????????????????????????????????????????????????????
 *
 * @author ?????????????????§???
 */
class UTRummyCard {

	/**
	 * int ??????????????°???????????????????????¢
	 */
	private int frontnumber = 0;

	/**
	 * String ???????????????????????????????£???¢
	 */
	private String rearColor = "";

	/**
	 * boolean ????????????????¨??????????????????¨?????????????????????????????¨????????????
	 */
	private boolean isUse = false;

	/**
	 * ??????????????°???????????????????????????
	 *
	 * @return int?????????
	 */
	public int getFrontnumber() {
		return frontnumber;
	}

	/**
	 * ????????????????????§int????????\????????????????????????????????????
	 *
	 * @param frontnumber
	 *            int?????????
	 */
	public void setFrontnumber(int frontnumber) {
		this.frontnumber = frontnumber;
	}

	/**
	 * ???????????????????????????????????????
	 *
	 * @return String?????????
	 */
	public String getRearColor() {
		return rearColor;
	}

	/**
	 * ?????????????????????String????????\????????????????????????????????????
	 *
	 * @param rearColor
	 *            String?????????
	 */
	public void setRearColor(String rearColor) {
		this.rearColor = rearColor;
	}

	/**
	 * boolean???????£????????????????????????????
	 *
	 * @return boolean?????????
	 */
	public boolean isUse() {
		return isUse;
	}

	/**
	 * boolean???????????????????????????
	 *
	 * @param isUse
	 *            boolean?????????
	 */
	public void setUse(boolean isUse) {
		this.isUse = isUse;
	}

	/**
	 * ????????????????????????
	 *
	 * ????????????????????????????????????????????????????????°??¨??????int, String, boolean???
	 *
	 * @param num
	 *            ???????????????????????????????????°???
	 * @param color
	 *            ????????????????????????????????????
	 * @param isUse
	 *            ????¨??????¨?????§??????????£????
	 */
	public UTRummyCard(int num, String color, boolean tool) {
		frontnumber = num;
		rearColor = color;
		isUse = tool;
	}
}// UTRummyCard?????????????????????