当前位置:首页 > > 充电吧
[导读]回旋矩阵,顾名思义,就是从外圈数字由小到大旋转到内圈的N阶矩阵。2阶回旋矩阵1  24  33阶回旋矩阵1  2  3 8  9  4 7  6  54阶回旋矩阵  1    2    3   412

回旋矩阵,顾名思义,就是从外圈数字由小到大旋转到内圈的N阶矩阵。
2阶回旋矩阵
1  2
4  3
3阶回旋矩阵
1  2  3 
8  9  4 
7  6  5
4阶回旋矩阵
  1    2    3   4
12  13  14   5     
11  16  15   6      

10   9   8  7

一.对称分析法

N阶矩阵,意味着从外至内一共有N/2向下取整个空心矩阵,比如4阶矩阵,就由内外两个子矩阵组成。


而对于每个子矩阵,可以采用上下和左右对称分析,如下图。


箭头不代表方向,因为QQ截图画不出直线。对于最外层的子矩阵,上边的1、2、3、4和下边的7、8、9、10;左边的11、12和右边5、6可以对称分析。

代码如下。

#include#includeusing namespace std;

int matrix(int i, int j, int n);

int main()
{
    int n, i, j, num=1;

    cout << "Please input N:";
    cin >> n;

    int a[100][100]={0};

    for(int m=0;m<n/2;m++)//n阶矩阵,意味着从外至内一共有n/2向下取整个矩阵;
    {
        for(j=m;j<n-m;j++)//上
        {
            a[m][j]=num++;
        }
        for(i=m+1;i=m;j--)//下
        {
            a[n-m-1][j]=num++;
        }
        for(i=n-m-2;i>=m+1;i--)//左
        {
            a[i][m]=num++;
        }

    }
    if(n%2==1)//当阶数%2=1时,最中间的数值
    {
        a[n/2][n/2]=n*n;
    }
    for(i=0;i<n;i++)//输出矩阵
    {
        for(j=0;j<n;j++)
        {
            cout << setw(4) <<a[i][j];
        }
        cout << endl <<endl;
    }

    return 0;
}

此处思路是大环套小环的“嵌套”思路,即由外圈向内,逐圈进行计算,得益于数组可以先计算再输出的所谓优点,可以先计算出每一圈各个位置的每个数之后,再进行整体的输出。这里的方法更将每一环切分为4小段,再对每一段上的每一个数进行填充。

二.循环输出法

这种方法是最原始的方法,就是将矩阵的每环由外至内循环输出,最外层的为0环,环数向内依次递增。每环的数据分段输出,分段规则如下图所示,这里以6阶矩阵的0环为例。


依次输出红框中的数据——>绿框中的数据——>蓝框中的数据——>黄框中的数据,每个框中数据输出的顺序是从上到下,从左到右。

#include#include#define max(a,b)        (((a) > (b)) ? (a) : (b))
#define min(a,b)        (((a) < (b)) ? (a) : (b))

using namespace std;

int matrix(int i, int j, int n);

int main()
{
    int n, i, j;

    cout << "Please input N:";
    cin >> n;

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << setw(4) << matrix(i, j, n);
        }
        cout << endl <<endl;
    }

    return 0;
}

int matrix(int i, int j, int n)
{
    int m, a, l;
    //计算在第几环,每环相当于一个子空心矩阵
    m = min( min( i, n-1-i ), min( j, n-1-j ) );
    //让每一个子矩阵的首元素的下标都为[0][0],这样所有的子矩阵就可以同等对待
    i -= m;
    j -= m;

    a = 1 + 4*m*(n-m);   //首元素

    l = n - 2*m;         //环边长

    if (i == 0)
    {
        //返回红框中的元素。
        return a+j;
    }
    else if (j == 0)
    {
        //返回绿框中的元素。以0环为例,0环的元素个数为6*4-4=(6-1)*4,
        //即0环矩阵每条边的元素(边长)*边数-四个被重复计算了的元素。
        //很显然元素20=1+4*(6-1)-1,19=1+4*(6-1)-2,......
        //绿框中的元素随着行数增加而递减,于是得出如下规律。
        return a + 4*(l-1) - i;
    }
    else if (i == l-1)
    {
        //返回蓝框中的元素。元素15等于0环的最大元素a+4*(l-1)-1减去5(即l-1),
        //也就是15=a+4*(l-1)-1-(l-1)=a+3*l-4=a+3*l-3-j,对于15而言,j=1。
        return a + 3*l - 3- j;
    }
    else if (j == l-1)
    {
        //返回黄框中的元素。
        return a + l-1 + i;
    }
}

三.任意阶矩阵

既然是任意阶矩阵,那么N阶矩阵当然包括在内,强烈推荐这种写法。

#include#includeusing namespace std;

int main()
{
    int n=6,m=6;
    cout << "Please input M:";
    cin >> m;
    cout << "Please input N:";
    cin >> n;
    
    int num[100][100]={0};
    int count = 1;
    int x = 0, y = 0;
    int dx = 0, dy = 1;
    
    while (count = n - 1 || num[x][y+1] != 0))
        {
            dx = 1;
            dy = 0;
        }
        else if (dx == 1 && (x >= m - 1 || num[x+1][y] != 0))
        {
            dx = 0;
            dy = -1;
        } 
        else if (dy == -1 && (y <= 0 || num[x][y-1] != 0))
        {
            dx = -1;
            dy = 0;
        } 
        else if (dx == -1 && (x <= 0 || num[x-1][y] != 0))
        {
            dx = 0;
            dy = 1;
        }
        count++;
    }
    for(int i=0;i<m;i++)//输出矩阵
    {
        for(int j=0;j<n;j++)
        {
            cout << setw(4) <<num[i][j];
        }
        cout << endl <<endl;
    }

    return 0;
}


输出结果,7*9阶矩阵


四.变种

最近去快手面试,碰到了一个螺旋矩阵的变种,要求是这样的:给出一个正常的M*N阶数字矩阵,螺旋输出。

1   2    3    4

5   6    7    8

9   10 11  12

13 14 15  16

即输出结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

对于这道变形题,只需要将上面的代码稍作修改即可,将二位数组的赋值改为输出,代码如下。

#include#includeusing namespace std;

const int size = 4;
int num[size][size] = {
    1, 2, 3, 4,
    5, 6, 7, 8,
    9, 10, 11, 12,
    13, 14, 15, 16
};

int main()
{
    int n=4,m=4;
    int count = 1;
    int x = 0, y = 0;
    int dx = 0, dy = 1;

    for(int i=0;i<m;i++)//输出矩阵
    {
        for(int j=0;j<n;j++)
        {
            cout << setw(4) <<num[i][j];
        }
        cout << endl <<endl;
    }

    while (count <= m * n)
    {
        cout<< num[x][y] << " ";
        num[x][y]=0;
        x += dx;
        y += dy;
        if (dy == 1 && (y >= n - 1 || num[x][y+1] == 0))
        {
            dx = 1;
            dy = 0;
        }
        else if (dx == 1 && (x >= m - 1 || num[x+1][y] == 0))
        {
            dx = 0;
            dy = -1;
        }
        else if (dy == -1 && (y <= 0 || num[x][y-1] == 0))
        {
            dx = -1;
            dy = 0;
        } 
        else if (dx == -1 && (x <= 0 || num[x-1][y] == 0))
        {
            dx = 0;
            dy = 1;
        }
        count++;
    }
    cout<<endl;


    return 0;
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭