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 C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITP1_11_D
{
    class Program
    {
        static void Main(string[] args)
        {
            DiceCast dicecast = new DiceCast();
            DicesJudge dicesJudge = new DicesJudge();
            // 1行目：サイコロの個数n
            // 2～n+1行目：各サイコロの面の整数
            // 入力されたサイコロがすべて異なる場合はYes,1組以上同じものが含まれる場合Noを出力するプログラム

            int n = int.Parse(Console.ReadLine());                                          // 1行目の取得
            int[,] dices = new int[n, 6];                                                   // サイコロの目をn行6列の2次元配列として宣言
            var judge = new List<string>();                                                 // 判定の初期化
            int count = 0;                                                                  // 同一面のカウント数の初期化

            // サイコロの目をそれぞれdice[j]とし、dice[0～5]をdices配列に格納
            for (int i = 0; i < n; i++)
            {
                int[] dice = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

                for (int j = 0; j < 6; j++)
                {
                    dices[i, j] = dice[j];                                                  // i(n)行分の配列をつくる
                }
            }

            // dicesから2つを選び一方を固定。もう一方のdicesの上面の値が等しくなるように回転させる
            for (int j = 0; j < n; j++)
            {
                for (int k = j + 1; k < n; k++)    // 2回のループでdicesの総当たりを記述
                {
                    dicecast.searchTop(dices, j, k);
                }
            }

            // diceが同じものかどうかの判定を行う
            for (int j = 0; j < n; j++)
            {
                for (int k = j + 1; k < n; k++)
                {
                    dicesJudge.SameJudge(dices, j, k, judge, count);
                }
            }

            // 結果を出力する
            if (judge.Contains("No"))
            {
                Console.WriteLine("No");
            }
            else
            {
                Console.WriteLine("Yes");
            }
        }
        public class DiceCast                                                                       // サイコロを回転させる処理を記述したメソッドがあるクラス
        {
            public void searchTop(int[,] dices, int j, int k)                                       // サイコロの上面が等しくなるように回転させるメソッド
            {
                for (int i = 0; i < 4; i++)
                {
                    if (dices[j, 0] != dices[k, 0])
                    {
                        axisX(dices, k);
                    }
                    if (dices[j, 0] != dices[k, 0])
                    {
                        axisZ(dices, k);
                    }
                }
            }
            public void axisX(int[,] dices, int k)                                                  // X軸を軸として回転させるメソッド
            {
                int roll0 = dices[k, 0];
                dices[k, 0] = dices[k, 1];
                dices[k, 1] = dices[k, 5];
                dices[k, 5] = dices[k, 4];
                dices[k, 4] = roll0;
            }
            public void axizY(int[,] dices, int k)                                                  // Y軸を軸として回転させるメソッド
            {
                int roll1 = dices[k, 1];
                dices[k, 1] = dices[k, 2];
                dices[k, 2] = dices[k, 4];
                dices[k, 4] = dices[k, 3];
                dices[k, 3] = roll1;
            }
            public void axisZ(int[,] dices, int k)                                                  // Z軸を軸として回転させるメソッド
            {
                int roll0 = dices[k, 0];
                dices[k, 0] = dices[k, 3];
                dices[k, 3] = dices[k, 5];
                dices[k, 5] = dices[k, 2];
                dices[k, 2] = roll0;
            }
        }

        public class DicesJudge
        {
            DiceCast dicecast = new DiceCast();
            TryCoincide tryCoincide = new TryCoincide();

            public void SameJudge(int[,] dices, int j, int k, List<string> judge, int count)
            {
                if (dices[j, 0] == dices[k, 0] && dices[j, 5] == dices[k, 5])                           // 上底面が一致するとき
                {
                    searchSameSide(dices, j, k, judge);
                }
                else if (dices[j, 0] == dices[k, 0])                                                    // 上面のみが一致するとき
                {
                    sameFiveSide(count, dices, k, judge);
                }
                else                                                                                    // 上底面が一致しないとき
                {
                    judge.Add("Yes");
                }
            }
            public void searchSameSide(int[,] dices, int j, int k, List<string> judge)                  // 側面方向に回転させ、すべての配列が一致する形があるか判定するメソッド
            {
                for (int i = 0; i < 4; i++)
                {
                    dicecast.axizY(dices, k);

                    if (dices[k, 1] == dices[j, 1] && dices[k, 2] == dices[j, 2] && dices[k, 3] == dices[j, 3] && dices[k, 4] == dices[j, 4])
                    {
                        judge.Add("No");
                        break;
                    }
                    else
                    {
                        judge.Add("Yes");
                    }
                }
            }
            public void sameFiveSide(int count, int[,] dices, int k, List<string> judge)                // 5つの面が同じサイコロであるかどうかを判定するメソッド
            {
                count = tryCoincide.countSameFaces(dices, k, count);

                if (count >= 4)
                {
                    judge.Add("No");
                }
                else
                {
                    judge.Add("Yes");
                }
            }
        }

        public class TryCoincide                                                                        // 一致する面があるか調べるメソッドがあるクラス
        {
            public int countSameFaces(int[,] dices, int k, int count)                                   // 上面[0]と等しい面がいくつあるかを数えるメソッド
            {
                for (int i = 1; i < 6; i++)
                {
                    if (dices[k, i] == dices[k, 0])
                    {
                        count++;
                    }
                }
                return count;
            }
        }
    }
}