螺旋队列 算法与代码
2010-04-29 21:46
260 查看
【问题描述】:螺旋队列;实现输入坐标(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;
}
【算法分析】:
队列数值范围:
第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;
}