您的位置:首页 > 其它

网易笔试题一道

2008-09-06 19:02 281 查看
今天在网上溜达看到一篇不错的文章,网址是:
http://blog.csdn.net/chinainvent/archive/2006/10/13/1332494.aspx
题目如下:

如图:




设“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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: