各种螺旋矩阵

                                    螺旋矩阵

无聊,不知道干点什么,今天就写个关于螺旋矩阵的问题吧,开始的三个螺旋矩阵采用的是同一种方法,后面会有新方法!

由外向内的螺旋矩阵

先来看看普通的螺旋矩阵,由外面向里面螺旋的 如下:

1    2   3    4   5

16 17 18  19   6

15 24 25  20   7

14 23 22  21   8

13 12 11  10   9

这样的N阶特殊矩阵,处理起来是最好处理的,4个循环分别给4面赋值,然后依次向内跳转就可以了,编写方法很多,我这里随便写了个:

int main()
{
	int num;
	scanf("%d",&num);
	int **array = (int **)malloc(sizeof(int *) * num);        //动态创建C语言的二维数组代码
	for(int i=0;i<num;++i)
		array[i] = (int *)malloc(sizeof(int)*num);

	int K=1,j,n=0;
	while(true)                                               //主要的赋值过程
	{
		i = j = n++;
		if( i > (num-1)/2 )
			break;
		for(;j<num-n;j++)
			array[i][j] = K++;
		for(;i<num-n;i++)
			array[i][j] = K++;
		for(;j>n-1;j--)
			array[i][j] = K++;
		for(;i>n-1;i--)
			array[i][j] = K++;
	}

	if( num%2 != 0)                                          //这个算法在最后一圈是一个元素(即中心)的时候没赋值,所以手动处理最后一个特殊位置
		array[num/2][num/2] = num*num;
	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
			printf("%4d",array[i][j]);
		printf("\n");
	}

	system("pause");
	return 0;
}

看起来好像很好看的样子


由内向外的螺旋矩阵

一般对于螺旋矩阵,我处理的方法都喜欢在末尾把最特殊的单独看待,不想再程序中加很多处理代码来兼容特殊情况,

由内向外的螺旋矩阵如图所示:


如果要以这种方式的话,请确保矩阵的边数是奇数!( 奇数会写了偶数也就同样道理了)   我的处理方式依旧还是,最中间那个首先搞为1,然后外层的依次4个循环,废话不多说,程序如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int num;
	scanf("%d",&num);

	if(num % 2 == 0)
		exit(0);

	int **array = (int **)malloc(sizeof(int *) * num);
	for(int i=0;i<num;++i)
		array[i] = (int *)malloc(sizeof(int)*num);
	
	int x = num/2,y = num/2;
	int n = 0;                       //控制循环往外的变量
	int N = 1;
	i = x;
	int j = y+1;                       //N赋值的变量 

	array[x][y] = N++;
	
	while(true)
	{
		n++;

		if(n+x>num-1)
			break;
		for(;i<=x+n;i++)
			array[i][j] = N++;
		i--;
		j--;

		for(;j>=y-n;j--)
			array[i][j] = N++;
		j++;
		i--;

		for(;i>=x-n;i--)
			array[i][j] = N++;
		i++;
		j++;

		for(;j<=y+n;j++)
			array[i][j] = N++;
	}

	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
			printf("%4d",array[i][j]);
		printf("\n");
	}

	system("pause");
	return 0;
}

运行结果如下:


方法很多,这种方法只是追求实现而已,可能程序简洁性不太好!!


上三角螺旋矩阵(蓝桥杯题目)

上三角螺旋矩阵,样例如下:

1      2     3     4   5

12   13    14    6

11    15      7

10     8

其实在上面两个螺旋矩阵里面我们都采用的是逐个赋值的方法,利用循环来控制赋值的方向,在这里我们姑且也先用这种方法!因为我觉得这个直观一点,但是他不是最简单的。这个我们稍后再说!由于C++中不支持那种锯齿数组,我们这里姑且用二维数组来表示!!

程序如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	int Num;
	scanf("%d",&Num);
	
	int **array = new int* [Num];
	for(int i=0; i<Num ; ++i)
		array[i] = new int [Num];
	
	i=0;
	int N = 0,j=0,n=0;
	
	while(true)                                   //同上面一样,主循环赋值
	{
		if(n > Num/2-1)
			break;
		
		for(;j<Num-1-2*n;j++)
			array[i][j] = N++;
		
		for(;i!=Num-1-2*n && j!=n;i++,j--)
			array[i][j] = N++;
		
		for(;i>n;i--)
			array[i][j] = N++;
		
		i++;
		j++;
		n++;
	}
	
	if(Num%3 == 1)
		array[Num/3][Num/3] = N;  //这里是处理特殊情况,也就是最中间一层只有一个元素时,单独赋值,已经证明在4,7,10时最中间只有一个元素

	for(i=0;i<Num;i++)
	{
		for(j=0;j<Num-i;j++)
			printf("%4d",array[i][j]);
		printf("\n");
	}
	
	system("pause");
	return 0;
}

运行结果,测试用例Num为19:










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值