螺旋矩陣 解法

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的情況時,可看出其是有規律的。可以 畫個座標軸來找出其幾何規律。就容易給每個數值分出圈子序號了。
其它情況和奇數情況就一樣了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章