zoukankan      html  css  js  c++  java
  • 网易程序笔试题

    题目如下:

    21     22    23    24    25    26

    20     7      8      9      10    27

    19     6      1      2      11    28

    18     5      4      3      12    29

    17    16     15    14    13    30

        如图:设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。我的程序,没有怎么调整,很粗糙,不过,实现就行了:#include <iostream>

    using namespace std;

    /* 

    设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,

    使程序做到输入坐标(X,Y)之后显示出相应的数字。

    */

    /************************************************************************

    **算法:数字是围绕1“盘旋”, 移动的步进值是1,1,2,2,3,3,4,4,5,5,6,6……

    **对于一个数,我们可以算出他移动的步数,然后和一个没有走完的偏移,如果恰好走完就是

    **偏移为0。

    **然后我们对于输入的值,我们模拟走过的路径来求值,步数表示已经走过而偏移表示要继续

    **走偏移数目的步数

    *************************************************************************/

    enum X {RIGHT = 1, DOWM = 1,LEFT = -1, UP = -1};

    /*

    *get_attribution()函数取得输入值移动过几次用times表示,

    *以及比每次移动的终点要多走的步数,用dif表示

    */

    void get_attribution(int in_number, int &dif, int ×) {

        int i = 0;

         in_number--;

        while (in_number >= 0) {

             in_number = in_number - (i/2+1);

             times = i;

             i++;

            if (in_number >= 0) {

                 dif = in_number;

             }

         }

    }

    int main()

    {

        int a = 21; //输入一个数值,这里就不人机交互输入了

        int dif = 0, times = 0; // 起始偏移距离和次数

         get_attribution(a, dif, times);

         cout << "偏移" << dif << "中间走了" << times << "次" << endl;

        int x = 0, y = 0; //起始端点

        for (int i = 1; i <= times; i++) {

            switch (i%4) { //已经走过了一些步数

                case 0: //上移到下一个端点

                     y += UP *((i-1)/2+1);                   break;

                case 1: //右移到下一个端点

                     x += RIGHT * ((i-1)/2+1);               break;

                case 2: //下移到下一个端点

                     y += DOWM * ((i-1)/2+1);                break;

                case 3: //左移到下一个端点

                     x += LEFT * ((i-1)/2+1);                break;

             }

         }

        switch (times%4) { //继续完成要偏移的值

            case 3: //接下来的操作是上移,x不变,y减小

                 y += UP * dif;              break;

            case 0: //接下来的操作是右移

                 x += RIGHT * dif;           break;

            case 1: //接下来的操作是下移

                 y += DOWM * dif;            break;

            case 2: //接下来的操作是左移

                 x += LEFT * dif;            break;

         }

         cout << "("   <<   x << ", " << y << ")" << endl;

        return 0;

    }

    作者给出了自己的程序,太长我就引用了,也给出了人家的程序 ,挺不错,如下:#include <iostream>

    #include <conio.h>

    #include <math.h>

    using namespace std;

    int newVal(int x, int y)

    {

        //以结点1为原点

        //以相邻两结点间的距离为单位(如结点2与结点3的之间线段)

        //结点7所在的正方形(由结点2、3、4、5、6、7、8、9构成)的边长

        //的一半为1,即结点7到原点1的最大投影距离为1。

        //于是由结点坐标,可以求出此结点所在的正方形的投影距离:

        int r = max(abs(x),abs(y));    

        

        //进行坐标变换,即把坐标原点移动到正方形的一个角结点上,

        //使整个正方形落在第一象限,例如,当r=1时,将把坐标原点从结点1

        //移动到结点7。

         x += r;

         y += r;

        //正方形的边长,等于投影距离的两倍

        int d = 2*r;

        int s;    //s为结点在自己的正方形的偏移量

        if (y == 0)

             s = 3*d + x;

        else if (x == 0)

             s = 2*d + (d-y);

        else if (y == d)

             s = d + (d-x);

        else

             s = y;

        //pow((r+1),2)为内层的结点数。

        //例如,结点10的内层由结点1和正方形A(2、3、4、5、7、8、10)构成

        //这些内层的总结点数恰为:(正方形A的边长+1)的平方,

        //因为:正方形A的边长 =(结点10所在正方形的半径-1)*2

        //故:内层结点数 = (结点10所在正方形的边长-1)的平方

       //结点值 = 在当前正方形的偏移量 + 内层的结点数

         s += pow((d-1),2);

        return s;

    }

    int main(int argc,char * argv[])

    {

        int x, y;

         cout <<"请输入坐标(x y):";

        while (cin>>x>>y)

         {

         cout <<"坐标所在的结点值为:"<<f(x, y)<<endl;

         cout <<"请输入坐标(x y):";

         }

        return 0;

    }

     

    ----------------------------------------------------------------------------------------------------------------------------------

    这是我写的,算法请看二楼

    #include<stdio.h>

    int GetX(int x)//求(X,0)
       {
        int result=1,i=0;
        if (x==0) return result;
        else if (x>0)
        {
            for(i=0;i<x;i++)
            {
                result = result + 1+8*i;//通项公试. a(n) = a(n-1) + a(0) + d*(n-1)
            }
            return result;
         }
         else if(x<0)
         {
            for(i=0;i<-x;i++)
            {
                result = result + 5+8*i;
            }
            return result;
         }
    }
    int GetY(int y)//求(0,Y)
    {
        int result=1,i=0;
        if (y==0) return result;
        else if (y>0)
        {
            for(i=0;i<y;i++)
            {
                result = result + 7+8*i;
            }
            return result;
         }
         else if(y<0)
         {
            for(i=0;i<-y;i++)
            {
                result = result + 3+8*i;
            }
            return result;
         }
    }
    int GetNum(int x,int y)//求(X,Y)对应的值
    {
        if(abs(x)<=abs(y))
        {
            if(y<=0)
            return GetY(y)+x;
            else return GetY(y)-x;
         }
        else
        {
            if(x<=0)
            return GetX(x)-y;
            else return GetX(x)+y;
        }

    }
           
    void main()
    {
        int x,y;
        while(1)
        {
        printf("please input (X,Y)\n");
        scanf("%d,%d",&x,&y);
        printf("The result is:%d\n",GetNum(x,y));
        }
        getch();

    }

  • 相关阅读:
    兼容性问题
    Webfont 的兼容性问题[持续更新]
    WebView的坑[持续更新]
    [转]60fps on the mobile web
    IT男送什么礼物给女朋友呢?
    Lumia 1520 IE mobile window.devicePixelRatio
    Fiddler 故障
    IE(8~11+) 可用右键加速器
    [转]Zen Cart官网屏蔽中国用户访问的真正原因
    Internet Explorer Developer Channel 自动化测试 IE 浏览器
  • 原文地址:https://www.cnblogs.com/qilinzi/p/1940544.html
Copyright © 2011-2022 走看看