最近看了比较多的一些矩阵的例子
所以自己就总结了一下这方面的一些算法的问题
首先来说说螺旋矩阵的算法
螺旋矩阵无非就是从第一个元素开始沿着矩形的边框逐个赋值,或者从中心点开始逐个的向外赋值
大致的思路我理清楚了,接下来就是更进一步的分析了
螺旋矩阵我们都知道是“矩形式”的逐个赋值,所以赋值的次数(也就是外层循环的次数)是根据有多少个矩形来决定的
然后就是逐个分析每个矩形的赋值方式,矩形有四条边,赋值顺序一次是上-右-下-左,这样就可以找出行列之间的关系,然后就可以逐个赋值了
具体的算法可以参考我前两篇博客来看看
http://blog.csdn.net/xuchao1229/article/details/8117312
http://blog.csdn.net/xuchao1229/article/details/8119261
然后再是前些时在c的论坛看到的一个帖子
就是对如下的矩阵进行编程(这里我就以5为基数来做例子)
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
首先也是分析它的赋值次数,我个人的方法是去除头为两个数字(也就是a[0][0]和a[n-1][n-1])然后再来看,因为是斜着赋值的(分为右上至左下,左下至右上)
所以一共就有7次,当然如果是n阶矩阵,那就是n+n-1-2
赋值的次数也清楚了,然后就是对内层循环的赋值进行分析了
首先引入一个变量(这里我就用m了)来对赋值次数进行控制,从1开始到2*n-3
如果赋值次数为奇数,我们不难发现,每次赋值的元素的行值和列值相加总是等于m的,偶数也是如此,只不过赋值方向不同
所以,我们就得出一个结论,当m为奇数的时候,我们就从上往下赋值,代码如下(count初始值为1,但是第一个元素已经赋值,所以下面就从2开始了)
//奇数行是从左下方至右上方赋值的
if(m%2)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i+j==m)
a[i][j]=count++;
}
如果是偶数,代码就如下
//偶数行是从右上方至左下方赋值的
else
{
for(i=n-1;i>=0;i--)
for(j=n-1;j>=0;j--)
if(i+j==m)
a[i][j]=count++;
}
这里要注意一下,里面的循环是最后一行和最后一列开始寻找的,因为这里是自左下往右上的方向进行赋值的,如果还是跟上面奇数的情况一样的话,那么就是跟上面一样的方式进行赋值了
基本思路都理清楚了,然后就是输出验证了,以下是完整代码还有运行结果图(当然大家也可以vc里面单步调试来看一下具体的变化情况,主要是看下else里面的代码块为什么跟上面的不同)
#include <stdio.h>
#define MAX_SIZE 50
int main(void)
{
int a[MAX_SIZE][MAX_SIZE];
int i,j,n,count=1;
printf("请输入矩阵的阶数:\n");
scanf("%d",&n);
//初始化数组
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
//第一个元素进行赋值
i=0;j=0;
a[0][0]=count++;
for(int m=1;m<=2*n-3;m++)//赋值的次数
{
//奇数行是从左下方至右上方赋值的
if(m%2)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i+j==m)
a[i][j]=count++;
}
//偶数行是从右上方至左下方赋值的
else
{
for(i=n-1;i>=0;i--)
for(j=n-1;j>=0;j--)
if(i+j==m)
a[i][j]=count++;
}
}
//最后一个元素赋值
i=n-1;j=n-1;
a[i][j]=count;
//输出矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-3d ",a[i][j]);
printf("\n");
}
return 0;
}
![](https://img-my.csdn.net/uploads/201211/11/1352642630_1752.png)
太晚了,呵呵,有时间继续更新一些,继续跟大家分享一些自己的总结O(∩_∩)O~