螺旋队列 算法与代码

来源:互联网 发布:打鱼软件开发购买 编辑:程序博客网 时间:2024/05/16 07:30

【问题描述】:螺旋队列;实现输入坐标(x , y)输出数值。

 

【算法分析】:

 

队列数值范围:

第1圈2~9

第2圈10~25

第3圈26~49

第t圈(2t-1)^2+1 ~ (2t+1)^2

 

东边:

最小值为(2t-1)^2+1,最小值所在的坐标为(t,1-t)。

除第一个值(最大值)外,

该列数值值为:  [(2t-1)^2+1] + [y-(1-t)] = (2t-1)^2+t+y

 

南边:

每边数值个数为2t+1,

该边最小值为:[(2t-1)^2+1]+(2t+1-2)

该边数值值为:[(2t-1)^2+1]+(2t+1-2)+t-x = (2t-1)^2+3t-x

 

西边:

该列最小值为:[(2t-1)^2+1]+(2t+1-2)+(2t+1-1)

该列数值值为:[(2t-1)^2+1]+(2t+1-2)+(2t+1-1)+t-y = (2t-1)^2+5t-y

 

北边:

该边最小值为:[(2t-1)^2+1]+(2t+1-2)+(2t+1-1)*2

该边数值值为:[(2t-1)^2+1]+(2t+1-2)+(2t+1-1)*2+t+x = (2t-1)^2+7t+x

 

【代码】:

#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 t;

int v;

t= max(x,y);

 

if(x==t && y!= -t)  //东

v = sqrt(2t-1)+t+y

if(y==t)  //南

v = sqrt(2t-1)+3t-x

if(x==-t)  //西

v = sqrt(2t-1)+5t-y

if(y==-t)  //北

v =  sqrt(2t-1)+7t+x

 

return v;

}

 

int main

{

int x,y;

int v;

scanf("%d,%d",&x,&y);

v = foo(x,y);

 

printf("%d (%d, %d)",v,x,y);

return 0;

}

原创粉丝点击