在上面向对象课程的时候,老师出了一个题目,让通过程序输出一个回型矩阵。
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;
}
给出一个运行的结果: