void fun1()
{
cout<<"Please Input :"<<endl;
int n;
cin>>n;
int level, temp_i, temp_j, num; //level 表示当前数在哪一层,核心层为第一层,表示为0。
//num 表示当前数在本层中按顺序的位置
int max_level = (n + 1) / 2;
bool up_right = true;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
{
temp_i = i - max_level;
temp_j = j - max_level;
level = abs(temp_i) > abs(temp_j) ? abs(temp_i) : abs(temp_j);
if(n % 2 == 0 && (temp_i + temp_j) <= 0)
++level;
if(abs(temp_i) >= abs(temp_j))
{
if(temp_i <= 0)
up_right = true;
else
up_right = false;
}else
{
if(temp_j >= 0)
up_right = true;
else
up_right = false;
}
if(up_right)
{
if(n % 2 == 0)
num = (temp_i + level - 1) + (temp_j + level - 1) + 1;
else
num = (temp_i + level ) + (temp_j + level) + 1;
}else
{
if(n % 2 == 0)
num = 8 * level - 4 - (temp_i + level - 1) - (temp_j + level - 1) + 1;
else
num = 6 * level - temp_i - temp_j + 1;
}
int sum = 0; //将现在数值的外面每一层的数值都加起来
if(n % 2 == 0)
for(int k = 0; k < max_level - level ; ++k)
sum += 8 * (max_level - k) - 4;
else
for(int k = 0; k < max_level - level - 1; ++k)
sum += 8 * (max_level - k - 1);
cout<< sum + num <<" ";
if(j % n == 0)
cout<<endl;
}
}
做这道题的思想是:
在奇数情况下
因为有个中心,机 n*n的数就是中心点。那么所有的数据都是围着他来绕圈的,可将这些围成的圈子排个序号,再将圈子中的每个数按从小到大的顺序排个序号,即可根据i,j来得出它所在的圈子序号,和他所在圈子中的序号,相加即可得出数值。
在偶数情况下
因为没有中心点。那么当我们写出 当n=4的情况时,可看出其是有规律的。可以 画个坐标轴来找出其几何规律。就容易给每个数值分出圈子序号了。
其它情况和奇数情况就一样了。