LCP 29-乐团站位

Raphael Liu Lv10

某乐团的演出场地可视作 num * num 的二维矩阵 grid(左上角坐标为 [0,0]),每个位置站有一位成员。乐团共有 9
种乐器,乐器编号为 1~9,每位成员持有 1 个乐器。 为保证声乐混合效果,成员站位规则为:自 grid 左上角开始顺时针螺旋形向内循环以
1,2,...,9 循环重复排列。例如当 num = 5 时,站位如图所示 ![image.png](https://pic.leetcode-
cn.com/1616125411-WOblWH-image.png) 请返回位于场地坐标 [Xpos,Ypos] 的成员所持乐器编号。 示例
1:
>输入:num = 3, Xpos = 0, Ypos = 2 > >输出:3 > >解释:
image.png 示例
2:
>输入:num = 4, Xpos = 1, Ypos = 2 > >输出:5 > >解释:
image.png 提示:
- 1 <= num <= 10^9 - 0 <= Xpos, Ypos < num

矩形的圈数为 : (num+1)/2 向上取整
当前坐标所在圈数 : 行号 , 列号 ,num-行号 ,num-列号 中最小的 +1 即为所在圈数
假设矩形如下
假设坐标 (1,3)
num=5;
image.png
圈数 : (5+1)/2=3
坐标所在圈数 : 1+1=2 在第二圈

边长为5的正方形面积 : 5 * 5=25
边长为(5-2(2(所在圈数)-1))的正方形面积* = 3 * 3 = 9;

红圈的面积 - 绿圈的面积

image.png

面积的差为 25-9=16
即当前圈之前有16个元素

所以当前圈左上角编号为 16%9 +1 = 8

image.png
然后就根据坐标在正方形的四个边的哪个边,来判断他的编号
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public int orchestraLayout(int n, int xPos, int yPos) {
//一共几圈
int quan=(n+1)/2;
long num=n;
//第几圈
int layer = Math.min(Math.min(yPos,xPos),Math.min( n - xPos - 1, n - yPos - 1))+1;
//总面积
long area=num*num;
//当前所在圈面积
long zhong=(num-2*(layer-1));
zhong*=zhong;
//求差 +1 得到当前圈左上角编号
long index=(area-zhong)%9+1;
//右边界
int right=n-layer;
//左边界
int left=layer-1;
if(xPos==left){
//在 --- 上
index+=yPos-left;
}else if(yPos==right){
//在 |上
index+=right-left;
index+=xPos-left;
}else if(xPos==right){
//在 __ 上
index+=2*(right-left);
index+=right-yPos;
}else{
//在 | 上
index+=3*(right-left);
index+=right-xPos;
}
return (int)(index%9==0?9:index%9);
}

image.png

 Comments
On this page
LCP 29-乐团站位