金融風暴

據說大家覺得很難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度)

Sprout_pD

By cswagger

Sprout_pD

  • 18