设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。
方法1:
\#include \<iostream\>\
\#include \<cmath\>\
using namespace std;\
\
int GetCoord(int x, int y)\
{\
//以结点1为原点\
//以相邻两结点间的距离为单位(如结点2与结点3的之间线段)\
//结点7所在的正方形(由结点2、3、4、5、6、7、8构成)的边长\
//的一半为1,即结点7到原点1的最大投影距离为1。\
//于是由结点坐标,可以求出此结点所在的正方形的投影距离:\
int r = max(abs(x),abs(y));\
\
//进行坐标变换,即把坐标原点移动到正方形的一个角结点上,\
//使整个正方形落在第一象限,例如,当r=1时,将把坐标原点从结点1\
//移动到结点7。\
x += r;\
y += r;\
\
//正方形的边长,等于投影距离的两倍\
int a = 2\*r;\
\
int s; //s为结点在自己的正方形的偏移量\
if (y == 0)\
s = 3\*a + x;\
else if (x == 0)\
s = 2\*a + (a-y);\
else if (y == a)\
s = a + (a-x);\
else \
s = y;\
\
//pow((r+1),2)为内层的结点数。\
//例如,结点9的内层由结点1和正方形A(2、3、4、5、7、8)构成\
//这些内层的总结点数恰为:(正方形A的边长+1)的平方,\
//因为:正方形A的边长 =(结点9所在正方形的半径-1)\*2\
//故:内层结点数 = (结点9所在正方形的边长-1)的平方\
//结点值 = 在当前正方形的偏移量 + 内层的结点数\
s += static\_cast\<int\>(pow(static\_cast\<float\>(a-1),2));\
\
return s;\
\
}\
int main(int argc,char \* argv[])\
{\
int x, y;\
cout \<\<"请输入坐标(x y):";\
while (cin\>\>x\>\>y)\
{\
cout \<\< "坐标所在的结点值为:" \<\< GetCoord(x, y) \<\< endl;\
cout \<\<"请输入坐标(x y):";\
}\
return 0;\
}\
// 别人写的,表示看不太懂,在纸上画个图,s怎么求的还是看不懂.\
\
\
/\*\
\
\#include "stdafx.h"\
\#include \<cstdlib\>\
int foo( const int x, const int y ){\
int r = std::max( abs(x), abs(y) );\
\
// a为此正方形的边长.\
int a = r\*2;\
int v = a - 1;\
v = v \* v + a;\
if( x == -r )\
v += a + r - y;\
else if( y == -r )\
v += 3\*a + x - r;\
else if( y == r )\
v += r - x;\
else v += y - r;\
return v;\
}\
int main(){\
int x, y;\
for( y = -4; y \<= 4; ++y ){\
for( x = -4; x \<= 4; ++x )\
cout \<\< std::setw(5) \<\< foo(x, y);\
cout \<\< endl;\
}\
cin \>\> x \>\> y;\
cout \<\< foo(x, y) \<\< endl;\
}\
\*/
方法2:
\#include "stdafx.h"\
\
int GetCoordinate( const int x, const int y ){\
int toLeft = 2, toRight = 1, toUp = 2, toDown = 1;\
int count = 1;\
int curCoordX = 0, curCoordY = 0;\
\
int i;\
for(;; toRight = toRight\*2 + 1, toDown = toDown\*2 + 1,\
toLeft \*= 2, toUp \*= 2)\
{\
// toward right\
for( i = 0; i \< toRight; ++i ){\
if( curCoordX == x && curCoordY == y )\
return count;\
++curCoordX;\
++count;\
}\
// toward down\
for( i = 0; i \< toDown; ++i ){\
if( curCoordX == x && curCoordY == y )\
return count;\
++curCoordY;\
++count;\
}\
// toward left\
for( i = 0; i \< toLeft; ++i ){\
if( curCoordX == x && curCoordY == y )\
return count;\
--curCoordX;\
++count;\
}\
// toward up\
for( i = 0; i \< toUp; ++i ){\
if( curCoordX == x && curCoordY == y )\
return count;\
--curCoordY;\
++count;\
}\
}\
}\
\
int main(){\
int x, y;\
while( cin \>\> x \>\> y )\
cout \<\< GetCoordinate( x, y ) \<\< endl;\
\
}