旋转队列

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);
            }            
        }        
        
    }

}

 

别人是这样干的

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

}

 

虽然都完成了功能,但是明显别人的代码要聪明一些,这种聪明是要积累的。我自己的代码在坐标比较大的时候运算肯定很慢的,

别人的就不会。我暂时还没想通他是怎样一个思路把这个算法想出来的。

 


 

 

 


posted @ 2008-12-18 21:21  Rossi  阅读(238)  评论(0编辑  收藏  举报