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的情況時,可看出其是有規律的。可以 畫個座標軸來找出其幾何規律。就容易給每個數值分出圈子序號了。
其它情況和奇數情況就一樣了。