螺旋队列
来源:互联网 发布:淘宝上有卖电棍的吗 编辑:程序博客网 时间:2024/05/17 02:46
21 22......
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
看清楚以上数字排列的规律,设一点的坐标是(0, 0), x方向向右为正,y方向向下为正。列如,7的坐标为(-1, -1), 2的坐标为(0, 1), 3的坐标为(1, 1)。编程实现输入任意一点坐标(x, y),输出所对应的数字。
解法一:
#include<stdio.h>
#define abs(a) ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))
int foo(int x,int y)...{
int t=max(abs(x),abs(y)); //求x,y的最大值
int u=2*t;
int v=u-1;
v=v*v+u; //每个边长为t的正方形的右下角位置的值,如(2,2)
// 下边都是先找到上面说的正方形的每个边的中点位置值
if(x==-t)
v+=u+t-y; //中点:v+u+t;如x=-2,v+u+t=19
else if(y==-t)
v+=3*u+x-t; //中点:v+3*u-t;如y=-2,v+3*u-t=23
else if(y==t)
v+=t-x;
else
v+=y-t;
return v;
//注意:x,y与t,-t,比较的顺序不能变,必须先比较负的t。x,y的顺序可变。
}
//输出
int main()
...{
int x,y;
for(y=-4;y<=4;y++)...{
for(x=-4;x<=4;x++)
printf("%5d",foo(x,y));
printf(" /n");
}
#define abs(a) ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))
int foo(int x,int y)...{
int t=max(abs(x),abs(y)); //求x,y的最大值
int u=2*t;
int v=u-1;
v=v*v+u; //每个边长为t的正方形的右下角位置的值,如(2,2)
// 下边都是先找到上面说的正方形的每个边的中点位置值
if(x==-t)
v+=u+t-y; //中点:v+u+t;如x=-2,v+u+t=19
else if(y==-t)
v+=3*u+x-t; //中点:v+3*u-t;如y=-2,v+3*u-t=23
else if(y==t)
v+=t-x;
else
v+=y-t;
return v;
//注意:x,y与t,-t,比较的顺序不能变,必须先比较负的t。x,y的顺序可变。
}
//输出
int main()
...{
int x,y;
for(y=-4;y<=4;y++)...{
for(x=-4;x<=4;x++)
printf("%5d",foo(x,y));
printf(" /n");
}
while(scanf("%d%d", &x,&y) == 2)
printf("%d/n"),foo(x,y);
return 0;
}
return 0;
}
解法二:给定一个坐标值(x,y) ,取得|x|,|y|中的最大值为c,得出所在正方形边的长度为2c+1,正方形右上角顶点值为2c+1的平方p,它的坐标为(m, n)(负坐标),次级正方形的右上角顶点值为2c-1的平方q,它的坐标为(j, k)(负坐标),y-n值的绝对值为d,x-m值的绝对值为b,判断d和b的值,1. d==0 && b==0,对应的值为p
2. x == c || y == c,对应的值为q+d+b
3. x == -c || y == -c,对应的值为p-d-b
#include <stdio.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define abs(a) ((a) > 0 ? (a) : -(a))
int foo(int x, int y)
...{
int c = max(abs(x), abs(y));
int p = (2 * c + 1) * (2 * c + 1);
int m = c;
int n = -c;
int q = (2 * c - 1) * (2 * c - 1);
int d = abs(y - n);
int b = abs(x - m);
if (d == 0 && b == 0)
return p;
else if (x == c || y == c)
return q + d + b;
else if (x == -c || y == -c)
return p - d - b;
else
printf("error "); /**//* 这种情况不会发生 */
return 0;
}
int main()
...{
int x, y;
for (y = -4; y <= 4; y++)
...{
for (x = -4; x <= 4; x++)
printf("%5d", foo(x, y));
printf(" ");
}
while (scanf("%d %d", &x, &y) == 2)
printf("%d ", foo(x, y));
return 0;
}
#define max(a, b) ((a) > (b) ? (a) : (b))
#define abs(a) ((a) > 0 ? (a) : -(a))
int foo(int x, int y)
...{
int c = max(abs(x), abs(y));
int p = (2 * c + 1) * (2 * c + 1);
int m = c;
int n = -c;
int q = (2 * c - 1) * (2 * c - 1);
int d = abs(y - n);
int b = abs(x - m);
if (d == 0 && b == 0)
return p;
else if (x == c || y == c)
return q + d + b;
else if (x == -c || y == -c)
return p - d - b;
else
printf("error "); /**//* 这种情况不会发生 */
return 0;
}
int main()
...{
int x, y;
for (y = -4; y <= 4; y++)
...{
for (x = -4; x <= 4; x++)
printf("%5d", foo(x, y));
printf(" ");
}
while (scanf("%d %d", &x, &y) == 2)
printf("%d ", foo(x, y));
return 0;
}
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 螺旋队列
- 080424
- IT专业术语备忘录(中英对照)- 随时更新...
- 错误堆砌的人生
- 080425
- 了解SQL Server 2005五个有用的动态管理对象
- 螺旋队列
- 如何使用SQL Server 2005 INSTEAD-OF触发器
- FASM--Win32汇编学习6
- Ubuntu 7.10下先安装Virtualbox虚拟机再安装Windows XP
- 如何实现文件关联
- 如何利用SQL Server 2005中的模板参数
- ubuntu下安装虚拟机
- SQL Server 2005 Express Edition和SQL Server Management Studio Express安装步骤详解
- 080426打印矩形