某乐团的演出场地可视作 num * num 的二维矩阵 grid(左上角坐标为 [0,0]),每个位置站有一位成员。乐团共有 9 种乐器,乐器编号为 1~9,每位成员持有 1 个乐器。
为保证声乐混合效果,成员站位规则为:自 grid 左上角开始顺时针螺旋形向内循环以 1,2,…,9 循环重复排列。例如当 num = 5 时,站位如图所示
请返回位于场地坐标 [Xpos,Ypos] 的成员所持乐器编号。
示例 1:
输入:num = 3, Xpos = 0, Ypos = 2
输出:3
解释:
示例 2:
输入:num = 4, Xpos = 1, Ypos = 2
输出:5
解释:
提示:
- 1 <= num <= 10^9
- 0 <= Xpos, Ypos < num
Python 解答:
1.暴力超时
class Solution:
def orchestraLayout(self, num: int, xPos: int, yPos: int) -> int:
dir = [(0,1), (1, 0), (0,-1), (-1,0)]
ini = [0,0]
i, j, length = 0, 0, num
while length > 0:
for n in range(3):
for k in range(length-1):
ini[0] += dir[i][0]
ini[1] += dir[i][1]
j += 1
if ini[0] == xPos and ini[1] == yPos:
return (j+1) % 9 if (j+1) % 9 != 0 else 9
i = (i+1)%4
for k in range(length-2):
ini[0] += dir[i][0]
ini[1] += dir[i][1]
j += 1
if ini[0] == xPos and ini[1] == yPos:
return (j+1) % 9 if (j+1) % 9 != 0 else 9
i = (i+1)%4
ini[1] += 1
j += 1
if ini[0] == xPos and ini[1] == yPos:
return (j+1) % 9 if (j+1) % 9 != 0 else 9
length -= 2
2.改进一下
class Solution:
def orchestraLayout(self, num: int, xPos: int, yPos: int) -> int:
layer = min(xPos, num-xPos-1, yPos, num-yPos-1)
out = num*num-(num-2*layer)*(num-2*layer)
i, j = layer, num-layer-1
if xPos == i:
out += yPos-i+1
elif yPos == j:
out += j-i + xPos-i+1
elif xPos == j:
out += 2*(j-i) + j-yPos+1
else:
out += 3*(j-i) + j-xPos+1
res = out%9
if res:
return res
else: return 9
留言