回旋数就是从中间的1开始然后围绕着这个1,按自然数的增长形式回旋1,
如:
43 | 44 | 45 | 46 | 47 | 48 | 49 |
|
42 | 21 | 22 | 23 | 24 | 25 | 26 |
|
41 | 20 | 7 | 8 | 9 | 10 | 27 |
|
40 | 19 | 6 | 1 | 2 | 11 | 28 |
|
39 | 18 | 5 | 4 | 3 | 12 | 29 |
|
38 | 17 | 16 | 15 | 14 | 13 | 30 |
|
37 | 36 | 35 | 34 | 33 | 32 | 31 |
|
1、解决的的思路
a、 首先得到这个数的基数(即每一环开始的数),
b、 然后得到其坐标所属第几排,
c、再次计算其位于这一排的位置,
d、最后算出结果。
2、针对个步骤所需要的编程指南
a、需要知道他前面的总数,设置了一个递归函数来求出来
int F(int n)//
{
if (n==0)
{ return 1;
}
return F(n-1)+(n-1)*8;
}
那么其基数就是
int begin=F(level)+1;//
level为他属于第几环
b、使用两个宏
#define Max(a,b) (a)>(b)?(a):(b)//
#define Abs(a) (a)<0?-(a):(a)//
if (x==level)//第一排
elseif (y==level) //第二排;
elseif (x==-level) //第三排;
其他为第四排
c、第几个需要自己看了
d计算OK
以下为程序
#define Max(a,b) (a)>(b)?(a):(b) //
#define Abs(a) (a)<0?-(a):(a) //求的a的绝对值;
using namespace std;
int F(int n) //得到第几层的基数-1值;
{
if (n==0)
{ return 1;
}
return F(n-1)+(n-1)*8;
}
int foo(int x,int y)
{
int level=Max(Abs(x),Abs(y)); //得到层数;
if (0==level)
{ return 1;
}
int m=2*level+1; //每层的每一排所拥有的个数;
int k=Abs(x+y); //在这一排中居于第几个;
int begin=F(level)+1; //得到每一层的基数;
int result=0;
//以下开始判断其坐标属于那一层;
if (x==level) //第一排;
{
if (k==0)
{
result=level*8-1+begin;
}
else {
result=begin+k-1;
}
}
else if (y==level) //第二排;
{
result=m-1+m-k-1-1+begin;
}
else if (x==-level) //第三排;
{
result=2*(m-1)+k-1+begin;
}
else{ //第四排
result=3*(m-1)+m-k-1-1+begin;
}
return result;
}
void main()
{
for (int i=-4;i<5;i++)
{
for (int j=-4;j<5;j++)
{
cout<<foo(j,i)<<"\t";
}
cout<<endl;
}