网易笔试题一道

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值