旋转队列
21 22 ....
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
如上一个旋转队列,1的坐标为(0,0),x往右为正,y往下为正,比如2(1,0),3(1,1),7(-1,-1).
写一个函数,输入坐标返回对应的值.
我是这样干的:
int foo(int des_x, int des_y)
{
int x=0,y=0,i,j,cal=1;
if(des_x==0&&des_y==0){
return(1);
}
for(i=1;1==1;i++){
for(j=1;j<=i;j++){
if(i&1)x++;
else x--;
cal++;
if(x==des_x&&y==des_y){
return(cal);
}
}
for(j=1;j<=i;j++){
if(i&1)y++;
else y--;
cal++;
if(x==des_x&&y==des_y){
return(cal);
}
}
}
}
{
int x=0,y=0,i,j,cal=1;
if(des_x==0&&des_y==0){
return(1);
}
for(i=1;1==1;i++){
for(j=1;j<=i;j++){
if(i&1)x++;
else x--;
cal++;
if(x==des_x&&y==des_y){
return(cal);
}
}
for(j=1;j<=i;j++){
if(i&1)y++;
else y--;
cal++;
if(x==des_x&&y==des_y){
return(cal);
}
}
}
}
别人是这样干的
#define max(a,b) (((a)<(b))?(b):(a))
#define abs(a) ((a)>0)?(a):(-(a))
int foo(int x, int y){
int t = max(abs(x), abs(y));
int u = t+t;
int v = u -1;
v = v * v +u;
if(x == -t)
v += u + t -y;
else if(y == -t)
v+=3*u+x-t;
else if(y == t)
v+=t-x;
else
v+=y-t;
return v;
}
#define abs(a) ((a)>0)?(a):(-(a))
int foo(int x, int y){
int t = max(abs(x), abs(y));
int u = t+t;
int v = u -1;
v = v * v +u;
if(x == -t)
v += u + t -y;
else if(y == -t)
v+=3*u+x-t;
else if(y == t)
v+=t-x;
else
v+=y-t;
return v;
}
虽然都完成了功能,但是明显别人的代码要聪明一些,这种聪明是要积累的。我自己的代码在坐标比较大的时候运算肯定很慢的,
别人的就不会。我暂时还没想通他是怎样一个思路把这个算法想出来的。