Problem:


フロッピーキューブ

フロッピーキューブをプログラミングで解いてみましょう。フロッピーキューブは図のように表面に色のついた９個の立方体から構成されている立体パズルで、キューブの列を回転させることによって、６つの各面の色をそろえます。 

フロッピーキューブに対しては下図のような４種類の操作を行うことができ、一回の操作で、端にある３つの隣接したキューブを１８０度回転することができます。わかりやすいように、図では、上面に＋(赤色)、下面に＊(緑色)、右前面に□(黄色)、左前面に●(青色)、右奥面に○(水色)、左奥面に■紫色) の記号が付いている状態を初期状態としています。

フロッピーキューブの初期状態が与えられるので、パズルを解くために必要な最小の操作回数を求めるプログラムを作成してください。 

入力

入力は以下の形式で与えられる。 

N
puzzle1
puzzle2
:
puzzleN

１行目のN (1 ≤ N ≤ 30) は操作回数を計算したいパズルの数である。続くN行に各フロッピーキューブの初期状態 puzzlei が与えられる。puzzlei は以下の形式で与えられる。 

p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26 p27 p28 p29 p30 

各フロッピーキューブの情報は 30 個の整数 pi (1 ≤ pi ≤ 6) からなる。pi は、下図のようにフロッピーキューブの各面に番号 i を振ったときの、そのキューブの面の色を表す。

パズルは、多くとも８回の操作で解くことができると仮定してよい。

出力

パズルごとに、最小の操作回数を１行に出力する。 

入出力例

入力例 

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

出力例

0
1
2
7



Sample input:
4
1 1 1 1 1 1 1 1 1 2 2 2 4 4 4 6 6 6 5 5 5 3 3 3 3 3 3 3 3 3
3 3 3 1 1 1 1 1 1 2 2 2 4 4 6 4 6 6 5 5 5 3 3 3 3 3 3 1 1 1
3 3 3 1 1 3 1 1 1 2 2 5 6 4 4 4 6 6 2 5 5 3 3 3 1 3 3 1 1 1
1 3 1 3 1 3 3 1 3 2 2 2 6 4 4 6 6 4 5 5 5 1 3 1 1 3 1 3 1 3


Sample output:
0
1
2
7

Submission status: Wrong Answer

Solution code:

def check(p):
    for i in range(1, 9):
        if p[i] != p[0]:
            return False
    for i in range(10, 12):
        if p[i] != p[9]:
            return False
    for i in range(13, 15):
        if p[i] != p[12]:
            return False
    for i in range(16, 18):
        if p[i] != p[15]:
            return False
    for i in range(19, 21):
        if p[i] != p[18]:
            return False
    for i in range(22, 30):
        if p[i] != p[21]:
            return False
    return True
    
    
def turn1(p):
    p[6], p[21] = p[21], p[6]
    p[7], p[22] = p[22], p[7]
    p[8], p[23] = p[23], p[8]
    p[12], p[17] = p[17], p[12]
    p[9], p[11] = p[11], p[9]
    

def turn2(p):
    p[0], p[27] = p[27], p[0]
    p[1], p[28] = p[28], p[1]   
    p[2], p[29] = p[29], p[2]
    p[14], p[15] = p[15], p[14]
    p[18], p[20] = p[20], p[18]
    
def turn3(p):
    p[0], p[23] = p[23], p[0]
    p[3], p[26] = p[26], p[3]
    p[6], p[29] = p[29], p[6]
    p[20], p[9] = p[9], p[20]
    p[17], p[15] = p[15], p[17]

def turn4(p):
    p[2], p[21] = p[21], p[2]
    p[5], p[24] = p[24], p[5]
    p[8], p[27] = p[27], p[8]
    p[18], p[11] = p[11], p[18]
    p[14], p[12] = p[12], p[14]


def search(p, cnt):
    if cnt == 8:
        return 99
    if check(p):
        return cnt
    
    r = 100
    turn1(p)
    r = min(r, search(p, cnt+1))
    turn1(p)
    turn2(p)
    r = min(r, search(p, cnt+1))
    turn2(p)
    turn3(p)
    r = min(r, search(p, cnt+1))
    turn3(p)
    turn4(p)
    r = min(r, search(p, cnt+1))
    turn4(p)

    return r


N = int(input())
for l in range(N):
    p = [int(i) for i in input().split()]
    print(search(p, 0))

Submission status: Wrong Answer

Solution code:
import heapq

swap_list = [
    {(6, 21), (7, 22), (8, 23), (9, 11), (12, 17)},
    {(0, 27), (1, 28), (2, 29), (14, 15), (18, 20)},
    {(0, 23), (3, 26), (6, 29), (15, 17), (9, 20)},
    {(2, 21), (5, 24), (8, 27), (12, 14), (11, 18)}
]


def check_complete(cube):
    for surface in (cube[:9], cube[9:12], cube[12:15], cube[15:18], cube[18:21]):
        val = surface[0]
        if any(block - val for block in surface):
            return False
    return True


def next_cubes(cube, prev):
    nc = [None] * 4
    for i in range(4):
        if i != prev:
            nci = cube[:]
            for a, b in swap_list[i]:
                nci[a], nci[b] = cube[b], cube[a]
            nc[i] = nci
    return nc


n = int(input())
while n:
    cube0 = list(map(int, input().split()))
    checked = []
    queue = [(0, cube0, -1)]
    while queue:
        cnt, cube, prev = heapq.heappop(queue)
        print(cnt, cube, prev)
        if cube in checked:
            continue
        if check_complete(cube):
            print(cnt)
            break
        checked.append(cube)
        for i, next_cube in enumerate(next_cubes(cube, prev)):
            if next_cube and not next_cube in checked:
                heapq.heappush(queue, (cnt + 1, next_cube, i))

    n -= 1

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    return True

def solve (n, p) :

    if (n > 7) :
        return 100

    if (valid(p)) :
        return 0 

    s = [solve(n + 1, op1(p)), solve(n + 1, op2(p)), solve(n + 1, op3(p)), solve(n + 1, op4(p))]
    s.sort()
    return s[0] + 1
    

N = int(input())
for i in range(0, N) :
    p = tuple([int(term) - 1 for term in input().split()])
    print(solve(0, p))

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    return True

def solve (n, p) :
    global minimum
    if (n > 8) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    s = [solve(n + 1, op1(p)), solve(n + 1, op2(p)), solve(n + 1, op3(p)), solve(n + 1, op4(p))]
    return

minimum = 100
N = int(input())
for i in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    solve(0, p)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    return True

def solve (n, p, i) :
    global minimum
    if (n > 8) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for i in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    return True

def solve (n, p, i) :
    global minimum
    if (n > 9) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for i in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    return True

def solve (n, p, i) :
    global minimum
    if (n > 9) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False
    q = (p[0], p[9], p[12], p[15], p[18], p[21])
    if (q == (0, 1, 3, 5, 4, 2)) :
        return True
#     if (q == (0, 3, 5, 4, 1, 2)) :
#         return True
#     if (q == (0, 5, 4, 3, 1, 2)) :
#         return True
#     if (q == (0, 4, 1, 3, 5, 2)) :
#         return True

    return False

def solve (n, p, i) :
    global minimum
    if (n > 9) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False
    q = (p[0], p[9], p[12], p[15], p[18], p[21])
    if (q == (0, 1, 3, 5, 4, 2)) :
        return True
    if (q == (0, 3, 5, 4, 1, 2)) :
        return True
    if (q == (0, 5, 4, 3, 1, 2)) :
        return True
    if (q == (0, 4, 1, 3, 5, 2)) :
        return True

    if (q == (2, 1, 5, 3, 4, 0)) :
        return True
    if (q == (2, 3, 5, 4, 1, 0)) :
        return True
    if (q == (0, 5, 4, 3, 1, 2)) :
        return True
    if (q == (0, 4, 1, 3, 5, 2)) :
        return True

    return False

def solve (n, p, i) :
    global minimum
    if (n > 9) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    q = (p[0], p[9], p[12], p[15], p[18], p[21])

    if (q == (0, 1, 3, 5, 4, 2)) :
        return True
    if (q == (0, 3, 5, 4, 1, 2)) :
        return True
    if (q == (0, 5, 4, 3, 1, 2)) :
        return True
    if (q == (0, 4, 1, 3, 5, 2)) :
        return True

    if (q == (2, 1, 5, 3, 4, 0)) :
        return True
    if (q == (2, 5, 3, 4, 1, 0)) :
        return True
    if (q == (2, 3, 4, 1, 5, 0)) :
        return True
    if (q == (2, 4, 1, 5, 3, 0)) :
        return True

    return False

def solve (n, p, i) :
    global minimum
    if (n > 8) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    q = (p[0], p[9], p[12], p[15], p[18], p[21])

    if (q == (0, 1, 3, 5, 4, 2)) :
        return True
    if (q == (0, 3, 5, 4, 1, 2)) :
        return True
    if (q == (0, 5, 4, 1, 3, 2)) :
        return True
    if (q == (0, 4, 1, 3, 5, 2)) :
        return True

    if (q == (2, 1, 5, 3, 4, 0)) :
        return True
    if (q == (2, 5, 3, 4, 1, 0)) :
        return True
    if (q == (2, 3, 4, 1, 5, 0)) :
        return True
    if (q == (2, 4, 1, 5, 3, 0)) :
        return True

    return False

def solve (n, p, i) :
    global minimum
    if (n > 8) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Wrong Answer

Solution code:
def op1 (p) :
    return (
        p[ 0],p[ 1],p[ 2],p[ 3],p[ 4],p[ 5],p[21],p[22],p[23],p[11],p[10],p[ 9],p[17],p[13],p[14],
        p[15],p[16],p[12],p[18],p[19],p[20],p[ 6],p[ 7],p[ 8],p[24],p[25],p[26],p[27],p[28],p[29]
    )

def op2 (p) :
    return (
        p[27],p[28],p[29],p[ 3],p[ 4],p[ 5],p[ 6],p[ 7],p[ 8],p[ 9],p[10],p[11],p[12],p[13],p[15],
        p[14],p[16],p[17],p[20],p[19],p[18],p[21],p[22],p[23],p[24],p[25],p[26],p[ 0],p[ 1],p [2]
    )

def op3 (p) :
    return (
        p[23],p[ 1],p[ 2],p[26],p[ 4],p[ 5],p[29],p[ 7],p[ 8],p[20],p[10],p[11],p[12],p[13],p[14],
        p[15],p[16],p[17],p[18],p[19],p[ 9],p[21],p[22],p[ 0],p[24],p[25],p[ 3],p[27],p[28],p[ 6]
    )

def op4 (p) :
    return (
        p[ 0],p[ 1],p[21],p[ 3],p[ 4],p[24],p[ 6],p[ 7],p[27],p[ 9],p[10],p[18],p[14],p[13],p[12],
        p[15],p[16],p[17],p[11],p[19],p[20],p[ 2],p[22],p[23],p[ 5],p[25],p[26],p[ 8],p[28],p[29]
    )

def op (p, i) :
    if (i == 1) :
        return op1(p)
    elif (i == 2) :
        return op2(p)
    elif (i == 3) :
        return op3(p)
    elif (i == 4) :
        return op4(p)

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    q = (p[0], p[9], p[12], p[15], p[18], p[21])

    if (q == (0, 1, 3, 5, 4, 2)) :
        return True
    if (q == (0, 3, 5, 4, 1, 2)) :
        return True
    if (q == (0, 5, 4, 1, 3, 2)) :
        return True
    if (q == (0, 4, 1, 3, 5, 2)) :
        return True

    if (q == (2, 1, 5, 3, 4, 0)) :
        return True
    if (q == (2, 5, 3, 4, 1, 0)) :
        return True
    if (q == (2, 3, 4, 1, 5, 0)) :
        return True
    if (q == (2, 4, 1, 5, 3, 0)) :
        return True

    return False

def solve (n, p, i) :
    global minimum
    if (n > 9) :
        return

    if (n >= minimum) :
        return

    if (valid(p)) :
        minimum = min(minimum, n)
        return

    for j in range(1, 5) :
        if (i != j) :
            solve(n + 1, op(p, j), j)
    return

minimum = 100
N = int(input())
for kk in range(0, N) :
    minimum = 100
    p = tuple([int(term) - 1 for term in input().split()])
    if (valid(p)) :
        print(0)
        continue
    for i in range(1, 5) :
        solve(1, op(p, i), i)
    print(minimum)

Submission status: Time Limit Exceeded

Solution code:

def check(p):
    for i in range(1, 9):
        if p[i] != p[0]:
            return False
    for i in range(10, 12):
        if p[i] != p[9]:
            return False
    for i in range(13, 15):
        if p[i] != p[12]:
            return False
    for i in range(16, 18):
        if p[i] != p[15]:
            return False
    for i in range(19, 21):
        if p[i] != p[18]:
            return False
    for i in range(22, 30):
        if p[i] != p[21]:
            return False
    return True
    
    
def turn1(p):
    p[6], p[21] = p[21], p[6]
    p[7], p[22] = p[22], p[7]
    p[8], p[23] = p[23], p[8]
    p[12], p[17] = p[17], p[12]
    p[9], p[11] = p[11], p[9]
    

def turn2(p):
    p[0], p[27] = p[27], p[0]
    p[1], p[28] = p[28], p[1]   
    p[2], p[29] = p[29], p[2]
    p[14], p[15] = p[15], p[14]
    p[18], p[20] = p[20], p[18]
    
def turn3(p):
    p[0], p[23] = p[23], p[0]
    p[3], p[26] = p[26], p[3]
    p[6], p[29] = p[29], p[6]
    p[20], p[9] = p[9], p[20]
    p[17], p[15] = p[15], p[17]

def turn4(p):
    p[2], p[21] = p[21], p[2]
    p[5], p[24] = p[24], p[5]
    p[8], p[27] = p[27], p[8]
    p[18], p[11] = p[11], p[18]
    p[14], p[12] = p[12], p[14]


def search(p, cnt):
    if cnt > 8:
        return 99
    if check(p):
        return cnt
    
    r = 100
    turn1(p)
    r = min(r, search(p, cnt+1))
    turn1(p)
    turn2(p)
    r = min(r, search(p, cnt+1))
    turn2(p)
    turn3(p)
    r = min(r, search(p, cnt+1))
    turn3(p)
    turn4(p)
    r = min(r, search(p, cnt+1))
    turn4(p)

    return r


N = int(input())
for l in range(N):
    p = [int(i) for i in input().split()]
    print(search(p, 0))

Submission status: Time Limit Exceeded

Solution code:
def op1 (p) :
    q = [i for i in p]
    q[12] = p[17]
    q[17] = p[12]
    q[6] = p[21]
    q[7] = p[22]
    q[8] = p[23]
    q[21] = p[6]
    q[22] = p[7]
    q[23] = p[8]
    q[9] = p[11]
    q[11] = p[9]
    return q

def op2 (p) :
    q = [i for i in p]
    q[14] = p[15]
    q[15] = p[14]
    q[0] = p[27]
    q[1] = p[28]
    q[2] = p[29]
    q[27] = p[0]
    q[28] = p[1]
    q[29] = p[2]
    q[18] = p[20]
    q[20] = p[18]
    return q

def op3 (p) :
    q = [i for i in p]
    q[9] = p[20]
    q[20] = p[9]
    q[0] = p[23]
    q[3] = p[26]
    q[6] = p[29]
    q[23] = p[0]
    q[26] = p[3]
    q[29] = p[6]
    q[15] = p[17]
    q[17] = p[15]

    return q

def op4 (p) :
    q = [i for i in p]
    q[11] = p[18]
    q[18] = p[11]
    q[2] = p[21]
    q[5] = p[24]
    q[8] = p[27]
    q[21] = p[2]
    q[24] = p[5]
    q[27] = p[8]
    q[14] = p[12]
    q[12] = p[14]

    return q

def valid (p) :
    for i in range(1, 9) :
        if (p[0] != p[i]) :
            return False

    for i in range(10, 12) :
        if (p[9] != p[i]) :
            return False

    for i in range(13, 15) :
        if (p[12] != p[i]) :
            return False

    for i in range(16, 18) :
        if (p[15] != p[i]) :
            return False

    for i in range(19, 21) :
        if (p[18] != p[i]) :
            return False

    for i in range(22, 30) :
        if (p[21] != p[i]) :
            return False
    return True

def solve (n, p) :
    if (n > 8) :
        return 100

    if (valid(p)) :
        return 0 

    s = [solve(n + 1, op1(p)), solve(n + 1, op2(p)), solve(n + 1, op3(p)), solve(n + 1, op4(p))]
    s.sort()
    return s[0] + 1
    

N = int(input())
for i in range(0, N) :
    p = [int(term) - 1 for term in input().split()]
    print(solve(0, p))