【趣味題】輸出蛇形矩陣(由內向外、由外向內)、輸出Z字形矩陣。

1.蛇形矩陣更新。2015-1-12

突然想到不管要從那邊開始打印,先存到數組,等輸出的時候調換i,j的起始和方向就行了,以前的弄麻煩了。
bool變量可控制從裏還是從外。
#include<stdio.h>
#define N 10

void snake(bool fromout)
{
	int a[N][N];
	int start=(fromout?0:-N*N-1);
	for(int k=0;k<N/2;k++)
	{
		int i=k,j=k;
		for(j=k;j<N-k-1;j++)
			a[i][j]=++start;
		for(i=k;i<N-k-1;i++)
			a[i][j]=++start;
		for(j;j>k;j--)
			a[i][j]=++start;
		for(i;i>k;i--)
			a[i][j]=++start;
	}
	//print
	for(int i=N-1;i>=0;i--)
	{
		for(int j=0;j<N;j++)
			printf("%4d",(fromout?1:-1)*a[j][i]);
		printf("\n");
	}
}
int main()
{
	snake(0);
	printf("\n\n");
	snake(1);
	return 0;
}


[舊版]1.輸出蛇形矩陣,由外層向內層和由外層向內層。

下面貼上由外層向內層的代碼:

#include<stdio.h>
#define N 10
int a[N][N]={0};
int count;
void fill_value_around(int line,int column)
{
	if(line>column)
		return;
	else if(line==column)
		a[line][column]=++count;
	int narrow=line;
	int line_record=line,column_record=column;
	for(;line<N-1-narrow;line++)
		a[line][column]=++count;
	for(;column>narrow;column--)
		a[line][column]=++count;
	for(;line>narrow;line--)
		a[line][column]=++count;
	for(;column<N-1-narrow;column++)
		a[line][column]=++count;
	fill_value_around(line+1,column-1);
}

int main()
{
	count=0;
	fill_value_around(0,N-1);
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
			printf("%4d ",a[i][j]);
		printf("\n");
	}
	getchar();
}
如果希望由外向內,只需修改main函數中代碼如下(只要修改count=-N*N-1和printf中加負號)

int main()
{
	count=-N*N-1;//修改1
	fill_value_around(0,N-1);
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
			printf("%4d ",-a[i][j]);//修改2
		printf("\n");
	}
	getchar();
}
簡單說一下思路,寫一個函數,目的是填寫外圈的一層,然後到達下一層的入口。然後遞歸即可。


2.Z字形填數。

1    2    6

3    5    7

4    8    9

思路:lean_fill函數,toward用來記錄方向,區分是向左下還是右上填寫。、

在函數內部執行循環直至到達邊界。

有一個地方,填完最長的對角線後,我選擇了從右下角再開始反着填寫。不過後來想起來,每條線上的數字角標是有規律的,其角標和逐次+1。

不過這麼寫有更好的適應性,只需要修改邊界和填寫方向即可實現不同方向的Z字填數。

#include<stdio.h>
#include<windows.h>
#define N 5
int a[N][N]={0};
int count;

void lean_fill(int toward,int line,int column)
{
	while(line<N&&column<N&&line>=0&&column>=0)
	{
		a[line][column]=++count;
		line=line+toward;
		column=column-toward;
	}
}
int main()
{
	count=0;
	int line=0,column=0;
	int flag=1;
	for(int i=0;i<N;)
	{
		flag=-flag;
		lean_fill(flag,i++,0);
		flag=-flag;
		lean_fill(flag,0,i++);
	}
	count=-N*N-1;
	flag=-1;
	for(int i=N-1;i>0;)
	{
		flag=-flag;
		lean_fill(flag,i--,N-1);
		flag=-flag;
		lean_fill(flag,N-1,i--);
	}
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			if(a[i][j]<0)
				a[i][j]*=-1;
			Sleep(100);
			printf("%4d ",a[i][j]);
		}
		printf("\n");
	}
	getchar();
}

以上兩題難度不大,主要還是學到了用windows.h延時輸出纔想着把它們貼上來以做記錄。

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