1. 程式人生 > >C語言蛇形矩陣2

C語言蛇形矩陣2

#include<stdio.h>
#include<malloc.h>
int main()
{
	int **p=NULL;
	int n,i,j,k=1,q=0,line;
	printf("請輸入矩陣的行數:");
	scanf("%d",&n);
	if((p=(int**)malloc(sizeof(int**)*n))==NULL)//根據行數分配記憶體,分配雙指標
	{
		printf("不能分配記憶體!!!\n");
		return 1;
	}
	for(i=0;i<n;i++)
	{
		if((p[i]=(int*)malloc(sizeof(int*)*n))==NULL)//為每一行分配指標,每一行有n個數
		{
			printf("不能分配記憶體!!!\n");
			return 1;
		}
	}
	for(i=0,j=0;k<=n*n;q++)//q是斜線上i+j相等的值,例如p[0][2],p[1][1],p[2][0]中q的值為2;
	{
		if(q%2==0)//如果q是偶數,就從下往上開始賦值
		{
			for(line=i;line>=0;line--)
			{
				if(q-line<n)//防止陣列越界,比如宣告4*4的陣列當i=0,q=5時,q-line為5,越界了
					p[line][q-line]=k++;
			}
		}
		else//如果q是奇數,就從上往下開始賦值
		{
			for(line=0;line<=i;line++)
			{
				if(q-line<n)
					p[line][q-line]=k++;
			}
		}
		if(i<n-1)
		{
			i++;//防止陣列越界i,j的值最大為n-1,而q的值最大為2*(n-1)
			j++;
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%-6d",p[i][j]);
		}
		printf("\n");
	}
	for(i=0;i<n;i++)//分別釋放每一行的指標
	{
		free(p[i]);
		p[i]=NULL;
	}
	free(p);//釋放雙指標
	p=NULL;
	return 0;
}