21 22 23 24 ... 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 看清以上数字的排列规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正。例如,7的坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。 |
#include <stdafx.h>
#include <iostream>
using namespace std;
int abs(int x)
{
if(x>0)
return x;
else
return -x;
}
int getNum(int x,int y)
{
int n,s; // n是所在圈数,s为上圈末尾值
int val; // 结果
if (0==x && 0==y)
return 1;
// 下面六句才是关键,应该好懂吧,呵呵.......
n=abs(x)>abs(y)?abs(x):abs(y); //确定圈数
s=(n*2-1)*(n*2-1); //计算上圈最后一个值,为2n-1的平方
if(x==n && y!=-n)
val=s+n+y; // 第1列,s+n后为中间值,加减x或y调整
else if(y==n && x!=n)
val=s+n-x+n*2; // 第2列,第二列加上2n调整,2n就是第一列的几个数
else if(x==-n && y!=n)
val=s+n-y+n*2*2;// 第3列,第三列加上2个2n
else if(y==-n && x!=-n)
val=s+n+x+n*2*3;// 第4列,同样的,第四列加3个2n
return val;
}
void main(void)
{
int i,j;
for(i=-4;i<=4;++i)
{
for(j=-4;j<=4;++j)
{
cout<<getNum(j,i)<<"/t";
}
cout<<endl;
}
}