#28302: 超簡單想法 不暴力解


super94kyle@gmail.com (黑亡子)

學校 : 不指定學校
編號 : 143417
來源 : [122.116.74.71]
最後登入時間 :
2022-01-04 23:07:17
c292. APCS2017-0304-3數字龍捲風 -- 2017年3月APCS | From: [122.116.74.71] | 發表日期 : 2021-11-27 12:51

以3為例 可以觀察出他的移動方式是 1 轉彎 1 轉彎 2 轉彎 2 轉彎 2
 
 

 

 

2

3

8

 

 

  

 

 

 

 ↓

 

 

  

1

9

 

5

 

 

 

 

 

 

 

 

 

 

 

2

 ←

3

 ←

7

 

 

         
以5為例 可以觀察出他的移動方式是 1 轉彎 1 轉彎 2 轉彎 2 轉彎 3 轉彎 3 轉彎 4 轉彎 4 轉彎 4

3

 →

4

 →

2

 →

1

 →

4

 ↑

 

 

 

 

 

 

 

 ↓

4

 

2

3

8

 

9

 ↑

 

 

 

 

 ↓

 

 ↓

2

 

1

9

 

5

 

6

 ↑

 

 

 

 

 

 ↓

 

 ↓

4

 ←

2

 ←

3

 ←

7

 

8

 

 

 

 

 

 

 

 

 ↓

1

 ←

2

 ←

6

 ←

4

 ←

3

 

 
上述兩個例子發現到n-1 每個都執行兩次 在執行一次n-1
可以把它看成一個(x,y) 左上角是(0,0)
所以不用用4個case一個一個解 從正中間開始 用字典依序 左(x-1) 上(y-1) 右(x+1) 下(y+1) (從哪個動作開始要看第二行的輸入
 
以三為例 原本的1 轉彎 1 轉彎 2 轉彎 2 轉彎 2 可以改成---> x-1 轉彎 y-1 轉彎 x+1 x+1 轉彎 y+1 y+1 轉彎 x-1 x-1
 
以下程式碼(PYTHON)
.
.
.
.
.
.
.
.
.
.
.
.
.
xx = int(input())
move = int(input())
num = []
d = {0:[-1,0] , 1:[0,-1] , 2:[1,0] , 3:[0,1]}
for i in range(xx):
  num.append(list(map(int,input().split())))
time = 1
x = int((xx-1)/2)
y = int((xx-1)/2)
print(num[y][x],end = "")
for i in range(2 * (xx-1)):
  for j in range(time):
    temp = d[move]
    x += temp[0]
    y += temp[1]
    print(num[y][x],end = "")
  move += 1
  if i % 2 != 0:
    time += 1
  if move == 4:
    move = 0
for i in range(xx-1):
  temp = d[move]
  x += temp[0]
  y += temp[1]
  print(num[y][x],end = "")
 
ZeroJudge Forum