螺旋队列

来源:互联网 发布:淘宝上有卖电棍的吗 编辑:程序博客网 时间: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");
 }
     while(scanf("%d%d", &x,&y) == 2)
             printf("%d/n"),foo(x,y);
 
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 == -|| 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;
}

原创粉丝点击