1+ import sys
2+ import pypyjit
3+ from collections import defaultdict
4+ pypyjit .set_param ('max_unroll_recursion=-1' )
5+ input = lambda : sys .stdin .readline ().rstrip ()
6+ sys .setrecursionlimit (20000000 )
7+ INF = float ('inf' )
8+
9+ h , w = map (int , input ().split ())
10+ s = [list (map (int , input ().split ())) for _ in range (h )]
11+
12+ # 連続して同じところを操作すると元に戻るので、最初だけ4つの選択肢、そのあとは3つの選択肢
13+ # 左上、右上、左下、右下
14+
15+ def is_state_correct (X ):
16+ for i in range (h ):
17+ for j in range (w ):
18+ if X [i ][j ] != i * w + j + 1 :
19+ return False
20+ return True
21+
22+ def spin (pattern_num , X ):
23+ # 左上、右上、左下、右下
24+ tmp_X = [[0 for _ in range (w )] for _ in range (h )]
25+ dxy = [[0 , 0 ], [0 , 1 ], [1 , 0 ], [1 , 1 ]]
26+ x = dxy [pattern_num ][0 ]
27+ y = dxy [pattern_num ][1 ]
28+ for i in range (h - 1 ):
29+ for j in range (w - 1 ):
30+ tmp_X [i + x ][j + y ] = X [h - 2 - i + x ][w - 2 - j + y ]
31+ if y == 0 :
32+ for i in range (h ):
33+ tmp_X [i ][w - 1 ] = X [i ][w - 1 ]
34+ else :
35+ for i in range (h ):
36+ tmp_X [i ][0 ] = X [i ][0 ]
37+ if x == 0 :
38+ for j in range (w ):
39+ tmp_X [h - 1 ][j ] = X [h - 1 ][j ]
40+ else :
41+ for j in range (w ):
42+ tmp_X [0 ][j ] = X [0 ][j ]
43+ return tmp_X
44+
45+ def state_str (X ):
46+ return '_' .join (['_' .join (map (str , x )) for x in X ])
47+
48+ def display (X ):
49+ return '\n ' .join ([' ' .join (map (str , x )) for x in X ])
50+
51+ visited = defaultdict (lambda : INF )
52+ visited [state_str (s )] = 0
53+
54+ ans = INF
55+ def dfs (X , pre_pattern_num = - 1 , depth = 1 ):
56+ for i in range (4 ):
57+ if i == pre_pattern_num :
58+ continue
59+ tmp_X = spin (i , X )
60+ state = state_str (tmp_X )
61+ if visited [state ] < depth :
62+ continue
63+ visited [state ] = depth
64+ if depth + 1 >= 21 :
65+ continue
66+ dfs (tmp_X , i , depth + 1 )
67+
68+ if is_state_correct (s ):
69+ print (0 )
70+ exit ()
71+
72+ dfs (s )
73+ state = "_" .join ([str (x + 1 ) for x in range (h * w )])
74+ ans = visited [state ]
75+ if ans == INF :
76+ print (- 1 )
77+ else :
78+ print (ans )
0 commit comments