1. 程式人生 > >學如逆水行舟,不進則退

學如逆水行舟,不進則退

在上面向物件課程的時候,老師出了一個題目,讓通過程式輸出一個回型矩陣。

n=1的回型矩陣

1

n=2的回型矩陣

1     2

4     3

n=3的回型矩陣

1    2    3

8    9    4

7    6    5

n=4的回型矩陣

1       2     3    4

12   13   14   5

11    16  15   6

10     9     8    7

簡單分析就可以發現,回型矩陣的每一圈都是先向右增加,然後向下增加,然後向左增加,然後向上增加組成的。

根據這個規律得到程式碼:

/*
	writen by qianshou.
	2013/12/5 17:14 pm
	study at SDNU
*/
#include<iostream>
using namespace std;
int main()
{
	int n;//n表示矩陣的規模
	int i=0;//i表示行
	int j=0;//j表示列
	int m=1;//表示要填充的資料
	n=5;//輸出5乘以五的矩陣
	cout<<"請輸入矩陣的規模n:";
	cin>>n;
	int k=0;
	int t=n;//t是n的備份 
	//動態建立二維陣列 
	int **a=new int *[t];
	for(i=0;i<t;i++)
	{
		a[i]=new int [t];
	}
	i=0;
	while(n>0)
	{
		//1,列向右遞增;
		for(;j<n;j++)
		{
			a[i][j]=m;
			m++;
		}
		i++;		//指向下一行
		j--;		//j回退到合適位置 
		//2,行向下遞增;
		for(;i<n;i++)
		{
			a[i][j]=m;
			m++;
		}
		j--;		//指向前一列 
		i--;		//i回退到合適位置 
		//3,列向左遞減;
		for(;j>=t-n;j--)
		{
			a[i][j]=m;
			m++;
		}
		i--;		//指向上一行 
		j++;		//j回退到合適位置 
		//4,行向上遞減;
		for(;i>t-n;i--)
		{
			a[i][j]=m;
			m++;
		}
		j++;		//開始下一個迴圈 
		i++; 		//i回退到合適位置 
		n--;
	}
	//生成矩陣完成
	//輸出矩陣
	for(i=0;i<t;i++)
	{
		for(j=0;j<t;j++)
		{
			cout<<a[i][j]<<"\t";
		}
		cout<<endl;
	} 
	//釋放陣列空間
	for(i=0;i<t;i++)
	{
		delete [] a[i];
	}
	delete [] a; 
	return 0;
}

給出一個執行的結果: