当前位置: 主页> jj斗地主>

曝光:网易圭表笔试题

时间:2012-02-06 15:07 点击:

问题如下: 如图:设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小法式,使法式做到输入坐标(X,Y)之后表现出反应的数字。我的法式,没有奈何调节,很大略,但是,完毕就行了:#include 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 #include #include 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 <<"坐标地址的结点值为:"<
(转载请注明出处:http://www.shtongle.com/jjdoudizhu/20120206/2357.html)

------分隔线----------------------------
推荐内容