1. 程式人生 > >c語言編寫螺旋矩陣!

c語言編寫螺旋矩陣!

【問題描述】

輸出下面的n(3≤n≤19)階螺旋矩陣。輸入n(=10),輸出如下左圖所示的螺旋矩陣。輸入-n(=-10),輸出如下右圖所示的螺旋矩陣。

1   2   3   4   5   6   7   8   9  10

36  37  38  39  40  41  42  43  44  11

35  64  65  66  67  68  69  70  45  12

34  63  84  85  86  87  88  71  46  13

33  62  83  96  97  98  89  72  47  14

32  61  82  95 100  99  90  73  48  15

31  60  81  94  93  92  91  74  49  16

30  59  80  79  78  77  76  75  50  17

29  58  57  56  55  54  53  52  51  18

28  27  26  25  24  23  22  21  20  19

1  36  35  34  33  32  31  30  29  28

2  37  64  63  62  61  60  59  58  27

3  38  65  84  83  82  81  80  57  26

4  39  66  85  96  95  94  79  56  25

5  40  67  86  97 100  93  78  55  24

6  41  68  87  98  99  92  77  54  23

7  42  69  88  89  90  91  76  53  22

8  43  70  71  72  73  74  75  52  21

9  44  45  46  47  48  49  50  51  20

10  11  12  13  14   15  16  17  18  19

輸入格式

輸入一個整數n或(-n),n表示要輸出螺旋矩陣的階數。

輸出格式

輸出右旋或左旋n階螺旋矩陣。

#include<stdio.h>
#include<math.h>
#define max 21 
int a[max][max],i,j,c=1,count=1;
void Fun(int n,int N,int b)
{
	if(c<=c+n-1&&c<=N)//對框架上側邊的輸出
	{ 
		   for(j=count;j<=n;j++)
		   {
			   a[count][j]=c;
			   c++;
		   }	
    }
	if(c<=c+n-2&&c<=N)//對框架右側邊的輸出
	{
		for(i=count+1;i<=n-1;i++)
		{
			a[i][n]=c;
			c++;
		}
	}
	if(c<=c+n-2&&c<=N)//對框架下側邊的輸出
	{
		for(j=n;j>=count;j--)
		{
			a[n][j]=c;
			c++;
		}
	}
	if(c<=c+n-3&&c<=N)//對框架左側邊的輸出
	{
		for(i=n-1;i>=count+1;i--)
		{
			a[i][count]=c;
			c++;
		}
	}
	count++;//讓框架縮小為裡邊一層
	if(c<=N) Fun(n-1,N,b);
    //輸出矩陣
	else
	{
		for(i=1;i<=sqrt(N);i++)
		{
		    for(j=1;j<=sqrt(N);j++)
				if(b>0)
	     	printf("%d\t",a[i][j]);//右旋的螺旋矩陣
				else 
			printf("%d\t",a[j][i]);//左旋的螺旋矩陣(以右旋的螺旋矩陣為基礎,將行與列交換即可)
		     printf("\n");
		}
	}
}

int main()
{
	int n,N,b;//N代表矩陣中的最大值
	printf("請輸入一個n值:");
	while(~scanf("%d",&n))
	{
		c=1;count=1;
		N=n*n;
		b=n;
		if(n<0) n=-n;
		if(n==0) break;
		else
			Fun(n,N,b);
		printf("請輸入一個n值,若結束請輸入0:");
	}
	return 0;
}

在這裡,將右旋的螺旋矩陣編好後,左旋矩陣其實就是轉置一下矩陣,可以節省很多的空間與時間去重新敲寫程式碼,而且看上去更加的簡介。