Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Dice IV

Write a program which reads $n$ dices constructed in the same way as Dice I, and determines whether they are all different. For the determination, use the same way as Dice III.

Input

In the first line, the number of dices $n$ is given. In the following $n$ lines, six integers assigned to the dice faces are given respectively in the same way as Dice III.

Output

Print "Yes" if given dices are all different, otherwise "No" in a line.

Constraints

$2 \leq n \leq 100$

$0 \leq $ the integer assigned to a face $ \leq 100$

Sample Input 1

3
1 2 3 4 5 6
6 2 4 3 5 1
6 5 4 3 2 1

Sample Output 1

No

Sample Input 2

3
1 2 3 4 5 6
6 5 4 3 2 1
5 4 3 2 1 6

Sample Output 2

Yes

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	private String diceTop;
	private String diceFront;
	private String diceRight;
	private String diceLeft;
	private String diceBack;
	private String diceBottom;

	// ダイスのコンストラクタ
	Main(String top, String front, String right, String left, String back, String bottom) {
		setDiceTop(top);
		setDiceFront(front);
		setDiceRight(right);
		setDiceLeft(left);
		setDiceBack(back);
		setDiceBottom(bottom);
	}

	// ダイスのゲッター
	String getDiceTop() {
		return diceTop;
	}

	String getDiceFront() {
		return diceFront;
	}

	String getDiceRight() {
		return diceRight;
	}

	String getDiceLeft() {
		return diceLeft;
	}

	String getDiceBack() {
		return diceBack;
	}

	String getDiceBottom() {
		return diceBottom;
	}

	// ダイスのセッターメソッド
	void setDiceTop(String diceTop) {
		this.diceTop = diceTop;
	}

	void setDiceFront(String diceFront) {
		this.diceFront = diceFront;
	}

	void setDiceRight(String diceRight) {
		this.diceRight = diceRight;
	}

	void setDiceLeft(String diceLeft) {
		this.diceLeft = diceLeft;
	}

	void setDiceBack(String diceBack) {
		this.diceBack = diceBack;
	}

	void setDiceBottom(String diceBottom) {
		this.diceBottom = diceBottom;
	}

	@Override
	public boolean equals(Object obj) {
		// 引数のオブジェクトがDice型と一致するかチェック
		if (obj instanceof Main) {
			Main dice = (Main) obj;
			// ダイスの全面が一致しているときtrue
			if (this.diceTop.equals(dice.getDiceTop()) && this.diceFront.equals(dice.getDiceFront())
					&& this.diceRight.equals(dice.getDiceRight()) && this.diceLeft.equals(dice.getDiceLeft())
					&& this.diceBack.equals(dice.getDiceBack()) && this.diceBottom.equals(dice.getDiceBottom())) {
				return true;
			}
		}
		return false;
	}

	// メインメソッド
	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		int numberOfDice = scan.nextInt();
		// ダイスのインスタンスの変数を格納するリスト
		List<Main> diceName = new ArrayList<>();

		for (int i = 0; i < numberOfDice; i++) {
			// ダイスのインスタンスの生成
			Main dice = new Main(scan.next(), scan.next(), scan.next(), scan.next(), scan.next(), scan.next());
			// ダイスのインスタンスを追加
			diceName.add(dice);
		}

		// サイコロの組み合わせ分ループ
		top: for (int i = 0; i < numberOfDice - 1; i++) {
			for (int j = 1; i + j < numberOfDice; j++) {
				// 入力の段階で全面一致しているとき
				if (diceName.get(i).equals(diceName.get(i + j))) {
					System.out.println("No");
					break top;
				} else {
					// 北側に4回転
					for (int countN = 0; countN < 4; countN++) {
						diceName.get(i).diceRoll("N");

						// 回転するたびに上面をチェック
						if (diceName.get(i).getDiceTop().equals(diceName.get(i + j).getDiceTop())) {
							// 上面が一致したら側面と底面のチェック
							if (diceName.get(i).equals(diceName.get(i + j))) {
								// 全面一致したいたら脱ループ
								System.out.println("No");
								diceName.get(i).printNumber();
								break top;

								// 側面のうち一つが一致しないとき
							} else {
								// 右に最大３回転
								for (int countR = 0; countR < 3; countR++) {
									diceName.get(i).diceRoll("R");

									// 回転するたび側面と底面の一致をチェック
									if (diceName.get(i).equals(diceName.get(i + j))) {
										// 全面合っていたらループ脱
										System.out.println("No");
										break top;
									}
								}
							}
						}
					}
					if (diceName.get(i).equals(diceName.get(i + j))) {
						System.out.println("No");
						diceName.get(i).printNumber();
						break top;
					} else {
						// 次は東側で出る面をチェック
						for (int countE = 0; countE < 4; countE++) {
							// 東側に4回転
							diceName.get(i).diceRoll("E");

							// 回転するたびに上面をチェック
							if (diceName.get(i).getDiceTop().equals(diceName.get(i + j).getDiceTop())) {
								// 上面が一致したら側面と底面のチェック
								if (diceName.get(i).equals(diceName.get(i + j))) {
									// 全面合っていたら脱ループ
									System.out.println("No");
									break top;
									// 側面のうち一つが一致しないとき
								} else {
									// 右に最大３回転
									for (int countR = 0; countR < 3; countR++) {
										diceName.get(i).diceRoll("R");

										// 回転するたび側面と底面の一致をチェック
										if (diceName.get(i).equals(diceName.get(i + j))) {
											// 全面合っていたらループ脱
											System.out.println("No");
											break top;
										}
									}
								}
							}
						}

					}
				}
				// 同じサイコロが一組でもあった場合
				if (diceName.get(i).equals(diceName.get(i + j))) {
					System.out.println("No");
					diceName.get(i).printNumber();
					break top;
				} else {
					if (i + j == numberOfDice - 1) {
						// サイコロがすべて異なるとき
						System.out.println("Yes");
						break top;
					}
				}
				scan.close();
			} // 2番目のfor分
		} // 一番頭のfor文

		scan.close();

	}

	// ダイスを振ったときに上に来る目が変わる
	void diceRoll(String direction) {
		for (int i = 0; i < direction.length(); i++) {
			String letterDirection = String.valueOf(direction.charAt(i));

			if (letterDirection.equals("E")) {
				// サイコロが東側に転がる
				String change = getDiceTop();
				setDiceTop(getDiceLeft());
				setDiceLeft(getDiceBottom());
				setDiceBottom(getDiceRight());
				setDiceRight(change);

				// サイコロが南側に転がる
			} else if (letterDirection.equals("S")) {
				String change = getDiceTop();
				setDiceTop(getDiceBack());
				setDiceBack(getDiceBottom());
				setDiceBottom(getDiceFront());
				setDiceFront(change);
				;
				// ダイスが西側に転がる
			} else if (letterDirection.equals("W")) {
				String change = getDiceTop();
				setDiceTop(getDiceRight());
				setDiceRight(getDiceBottom());
				setDiceBottom(getDiceLeft());
				setDiceLeft(change);

				// ダイスが北側に転がる
			} else if (letterDirection.equals("N")) {
				String change = getDiceTop();
				setDiceTop(getDiceFront());
				setDiceFront(getDiceBottom());
				setDiceBottom(getDiceBack());
				setDiceBack(change);

				// ダイスが左向きに回転する
			} else if (letterDirection.equals("L")) {
				String change = getDiceFront();
				setDiceFront(getDiceRight());
				setDiceRight(getDiceBack());
				setDiceBack(getDiceLeft());
				setDiceLeft(change);

				// ダイスが右向きに回転
			} else if (letterDirection.equals("R")) {
				String change = getDiceFront();
				setDiceFront(getDiceLeft());
				setDiceLeft(getDiceBack());
				setDiceBack(getDiceRight());
				setDiceRight(change);
			}
		}
	}

	// ダイスの目をすべて出力(確認用)
	void printNumber() {
		System.out.print(getDiceTop());
		System.out.print(getDiceFront());
		System.out.print(getDiceRight());
		System.out.print(getDiceLeft());
		System.out.print(getDiceBack());
		System.out.println(getDiceBottom());
	}
}