现在的位置: 首页 > 综合 > 正文

螺旋矩阵 解法

2018年09月24日 ⁄ 综合 ⁄ 共 1077字 ⁄ 字号 评论关闭
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的情况时,可看出其是有规律的。可以 画个坐标轴来找出其几何规律。就容易给每个数值分出圈子序号了。
其它情况和奇数情况就一样了。

抱歉!评论已关闭.