螺旋队列算法详解
2008-12-06 19:35
316 查看
/* 螺旋队列
设1的坐标是(0,0),的方向向右为正,y方向向下为正,
例如,7的坐标为(-1,-1),2的坐标为(0,1)。
编程实现输入任意一点坐标(x,y),输出所对应的数字。
43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~)
1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层
2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1
3、每一圈数字分为四个区域:比如25所在的第二层:
21,22,23,24,25 A区,y == -t
17,18,19,20, B区,x == -t 除掉A区数字
13,14,15,16, C区,y == t 除掉AB区数字
10,11,12 D区,x == t 除掉ABC区数字
4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字,
这就是通过右上角数字取圈内任意数字的关键算法了
*/
#define abs(a) ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))
void print_helix_number(int n){
int x, y;
for(y=-n;y<=n;y++) {
for(x=-n;x<=n;x++){
printf("%5d",lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿
}
printf("/n");
}
}
int lookupHelixNumber(int x, int y){
int t = max(abs(x), abs(y));
int ur = (2*t+1)*(2*t+1);
int n = 1;
if ( y == -t)
n = ur-t+x;
else if (x == -t)
n = ur-3*t-y; //3t, 5t啥的是规律,观察一圈数字就知道拉
else if (y == t)
n = ur-5*t-x;
else
n = ur-7*t+y;
return n;
}
设1的坐标是(0,0),的方向向右为正,y方向向下为正,
例如,7的坐标为(-1,-1),2的坐标为(0,1)。
编程实现输入任意一点坐标(x,y),输出所对应的数字。
43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~)
1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层
2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1
3、每一圈数字分为四个区域:比如25所在的第二层:
21,22,23,24,25 A区,y == -t
17,18,19,20, B区,x == -t 除掉A区数字
13,14,15,16, C区,y == t 除掉AB区数字
10,11,12 D区,x == t 除掉ABC区数字
4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字,
这就是通过右上角数字取圈内任意数字的关键算法了
*/
#define abs(a) ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))
void print_helix_number(int n){
int x, y;
for(y=-n;y<=n;y++) {
for(x=-n;x<=n;x++){
printf("%5d",lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿
}
printf("/n");
}
}
int lookupHelixNumber(int x, int y){
int t = max(abs(x), abs(y));
int ur = (2*t+1)*(2*t+1);
int n = 1;
if ( y == -t)
n = ur-t+x;
else if (x == -t)
n = ur-3*t-y; //3t, 5t啥的是规律,观察一圈数字就知道拉
else if (y == t)
n = ur-5*t-x;
else
n = ur-7*t+y;
return n;
}
相关文章推荐
- 螺旋队列算法详解
- 多重背包O(N*V)算法详解(使用单调队列)(转)
- 螺旋队列算法分析
- 螺旋队列算法
- 螺旋矩阵、螺旋队列算法
- 螺旋队列 算法与代码
- 拓扑排序 详解+最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 螺旋队列算法分析 .
- 螺旋队列---算法分析
- 螺旋队列算法分析
- (1.1.1)螺旋队列算法分析
- 【算法】螺旋队列
- 多重背包O(N*V)算法详解(使用单调队列)(转载)
- 螺旋队列算法分析
- 螺旋队列算法分析
- 螺旋队列算法分析转
- C++螺旋队列算法分析
- Python实现的数据结构与算法之双端队列详解
- 螺旋队列最优算法的解法
- JavaScript数据结构与算法之队列原理与用法实例详解