网易笔试题一道

今天在网上溜达看到一篇不错的文章,网址是:
题目如下:
如图:
网易笔试题一道
设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。
我的程序,没有怎么调整,很粗糙,不过,实现就行了:
  1. #include<iostream>
  2. usingnamespacestd;
  3. /* 
  4. 设“1”的坐标为(0,0)“7”的坐标为(-1,-1)编写一个小程序,
  5. 使程序做到输入坐标(X,Y)之后显示出相应的数字。
  6. */
  7. /************************************************************************
  8. **算法:数字是围绕1“盘旋”,移动的步进值是1,1,2,2,3,3,4,4,5,5,6,6……
  9. **对于一个数,我们可以算出他移动的步数,然后和一个没有走完的偏移,如果恰好走完就是
  10. **偏移为0。
  11. **然后我们对于输入的值,我们模拟走过的路径来求值,步数表示已经走过而偏移表示要继续
  12. **走偏移数目的步数
  13. *************************************************************************/
  14. enumX{RIGHT=1,DOWM=1,LEFT=-1,UP=-1};
  15. /*
  16. *get_attribution()函数取得输入值移动过几次用times表示,
  17. *以及比每次移动的终点要多走的步数,用dif表示
  18. */
  19. voidget_attribution(intin_number,int&dif,int×){
  20. inti=0;
  21. in_number--;
  22. while(in_number>=0){
  23. in_number=in_number-(i/2+1);
  24. times=i;
  25. i++;
  26. if(in_number>=0){
  27. dif=in_number;
  28. }
  29. }
  30. }
  31. intmain()
  32. {
  33. inta=21;//输入一个数值,这里就不人机交互输入了
  34. intdif=0,times=0;//起始偏移距离和次数
  35. get_attribution(a,dif,times);
  36. cout<<"偏移"<<dif<<"中间走了"<<times<<"次"<<endl;
  37. intx=0,y=0;//起始端点
  38. for(inti=1;i<=times;i++){
  39. switch(i%4){//已经走过了一些步数
  40. case0://上移到下一个端点
  41. y+=UP*((i-1)/2+1);break;
  42. case1://右移到下一个端点
  43. x+=RIGHT*((i-1)/2+1);break;
  44. case2://下移到下一个端点
  45. y+=DOWM*((i-1)/2+1);break;
  46. case3://左移到下一个端点
  47. x+=LEFT*((i-1)/2+1);break;
  48. }
  49. }
  50. switch(times%4){//继续完成要偏移的值
  51. case3://接下来的操作是上移,x不变,y减小
  52. y+=UP*dif;break;
  53. case0://接下来的操作是右移
  54. x+=RIGHT*dif;break;
  55. case1://接下来的操作是下移
  56. y+=DOWM*dif;break;
  57. case2://接下来的操作是左移
  58. x+=LEFT*dif;break;
  59. }
  60. cout<<"("<<x<<","<<y<<")"<<endl;
  61. return0;
  62. }
作者给出了自己的程序,太长我就引用了,也给出了人家的程序,挺不错,如下:
  1. #include<iostream>
  2. #include<conio.h>
  3. #include<math.h>
  4. usingnamespacestd;
  5. intnewVal(intx,inty)
  6. {
  7. //以结点1为原点
  8. //以相邻两结点间的距离为单位(如结点2与结点3的之间线段)
  9. //结点7所在的正方形(由结点2、3、4、5、6、7、8、9构成)的边长
  10. //的一半为1,即结点7到原点1的最大投影距离为1。
  11. //于是由结点坐标,可以求出此结点所在的正方形的投影距离:
  12. intr=max(abs(x),abs(y));
  13. //进行坐标变换,即把坐标原点移动到正方形的一个角结点上,
  14. //使整个正方形落在第一象限,例如,当r=1时,将把坐标原点从结点1
  15. //移动到结点7。
  16. x+=r;
  17. y+=r;
  18. //正方形的边长,等于投影距离的两倍
  19. intd=2*r;
  20. ints;//s为结点在自己的正方形的偏移量
  21. if(y==0)
  22. s=3*d+x;
  23. elseif(x==0)
  24. s=2*d+(d-y);
  25. elseif(y==d)
  26. s=d+(d-x);
  27. else
  28. s=y;
  29. //pow((r+1),2)为内层的结点数。
  30. //例如,结点10的内层由结点1和正方形A(2、3、4、5、7、8、10)构成
  31. //这些内层的总结点数恰为:(正方形A的边长+1)的平方,
  32. //因为:正方形A的边长=(结点10所在正方形的半径-1)*2
  33. //故:内层结点数=(结点10所在正方形的边长-1)的平方
  34. //结点值=在当前正方形的偏移量+内层的结点数
  35. s+=pow((d-1),2);
  36. returns;
  37. }
  38. intmain(intargc,char*argv[])
  39. {
  40. intx,y;
  41. cout<<"请输入坐标(xy):";
  42. while(cin>>x>>y)
  43. {
  44. cout<<"坐标所在的结点值为:"<<f(x,y)<<endl;
  45. cout<<"请输入坐标(xy):";
  46. }
  47. return0;
  48. }

你可能感兴趣的:(算法,.net,Blog,F#,UP)