题目描述:
21 22。。。
20 07 08 09 10
19 06 01 02 11
18 05 04 03 12
17 16 15 14 13
仔细观察上述数字排列规律,设01点的坐标是(0,0),x方向向右为正,y方向向下为正。例如,07坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出对应的数字。
#include <stdio.h>
#define max(a,b) ((a)<(b)?(b):(a))
#define abs(a) ((a)>0?(a):(-a))
int func_queue(int x, int y);
//螺旋队列
int main()
{
int x;
int y;
while(1)
{
printf("please input x:");
scanf("%d", &x);
printf("please input y:");
scanf("%d", &y);
printf("result:%d/n", func_queue(x, y));
printf("enter ctrl+c to quit!/n");
}
return 1;
}
int func_queue (int x, int y)
{
if ((0 == x) && (0 == y))
return 1;
int Num = 0;
int maxabsXY = max(abs((x)), abs((y)));
int BaseNum = (maxabsXY*2 - 1) * (maxabsXY*2 - 1);
for (int i=-(maxabsXY-1); i<=maxabsXY; i++)
{
Num ++;
if ( (maxabsXY == x) && (i == y) )
return BaseNum + Num;
}
for (i=maxabsXY-1; i>=-maxabsXY; i--)
{
Num ++;
if ( (i == x) && (maxabsXY == y) )
return BaseNum + Num;
}
for (i=maxabsXY-1; i>=-maxabsXY; i--)
{
Num ++;
if ( (-maxabsXY == x) && (i == y) )
return BaseNum + Num;
}
for (i=-(maxabsXY-1); i<=maxabsXY; i++)
{
Num ++;
if ( (i == x) && (-maxabsXY == y) )
return BaseNum + Num;
}
return 0;
}