各種螺旋矩陣

                                    螺旋矩陣

無聊,不知道乾點什麼,今天就寫個關於螺旋矩陣的問題吧,開始的三個螺旋矩陣採用的是同一種方法,後面會有新方法!

由外向內的螺旋矩陣

先來看看普通的螺旋矩陣,由外面向裏面螺旋的 如下:

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:










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章