據說大家覺得很難QQ
1
8
9
6
15
3
4
12
11
2
7
10
13
5
16
14
1
8
9
6
15
3
4
12
11
2
7
10
13
5
16
14
1
8
9
6
15
3
4
12
11
2
7
10
13
5
16
14
1
8
15
3
S = max(1, 8, 15, 3) - min(1, 8, 15, 3) + 1 = 15
=>轉15*90度
15
1
3
8
S = max(1, 8, 15, 3) - min(1, 8, 15, 3) + 1 = 15
=>轉15*90度
15
1
6
12
3
8
9
4
11
2
14
16
13
5
10
7
S = 15
S = 9
S = 10
S = 12
整塊的 S = max(15, 9, 12, 10) - min(15, 9, 12, 10) + 1 = 7
=>轉7*90度
13
11
3
15
5
2
8
1
10
14
9
6
7
16
4
12
1.遞迴到左上、右上、左下、右下四塊正方形,並回傳個別的S值 2.計算S值 3.對當前所在正方形做旋轉
//利用 length 和 (row, col) 紀錄想操作的正方形大小和位置
//(row, col)代表左上角的座標
tornado(length, row, col) :
//base case
if (length is 1) :
return arr[row][col]
//1.遞迴到小正方形
S_a = tornado(length / 2, ..., ...) //左上角
S_b = tornado(length / 2, ..., ...) //右上角
S_c = tornado(length / 2, ..., ...) //左下角
S_d = tornado(length / 2, ..., ...) //右下角
//2.計算當前S值
S = max(S_a, S_b, S_c, S_d) - min(S_a, S_b, S_c, S_d) + 1
//3.旋轉他
rotate(length, row, col, S)
return S
一步到位可能太困難,所以我們拆成兩步驟做: 1.轉置 2.上下翻轉180度
15
1
6
12
3
8
9
4
11
2
14
16
13
5
10
7
轉置
swap(arr[i][j], arr[j][i])
15
3
11
13
1
8
2
5
6
9
14
10
12
4
16
7
上下翻轉
6
12
10
14
9
4
7
16
8
3
2
5
1
15
11
13
12
4
10
7
6
9
14
16
1
8
2
5
15
3
11
13
15
3
11
13
1
8
2
5
6
9
14
16
12
4
10
7
原本的矩陣
操作後的矩陣
15
1
6
12
3
8
9
4
11
2
14
16
13
5
10
7
6
12
10
14
9
4
7
16
8
3
2
5
1
15
11
13
12
4
16
7
6
9
14
10
1
8
2
5
15
3
11
13
1.如果轉270度就做三次轉90度(或是你要分開寫我也是沒意見) 2.可以%4(像是旋轉540度就是旋轉180度)