对于矩阵类型的一些算法的总结(一)

最近看了比较多的一些矩阵的例子

所以自己就总结了一下这方面的一些算法的问题


首先来说说螺旋矩阵的算法

螺旋矩阵无非就是从第一个元素开始沿着矩形的边框逐个赋值,或者从中心点开始逐个的向外赋值

大致的思路我理清楚了,接下来就是更进一步的分析了

螺旋矩阵我们都知道是“矩形式”的逐个赋值,所以赋值的次数(也就是外层循环的次数)是根据有多少个矩形来决定的

然后就是逐个分析每个矩形的赋值方式,矩形有四条边,赋值顺序一次是上-右-下-左,这样就可以找出行列之间的关系,然后就可以逐个赋值了

具体的算法可以参考我前两篇博客来看看

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;
}


太晚了,呵呵,有时间继续更新一些,继续跟大家分享一些自己的总结O(∩_∩)O~



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值