对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
以上是题目。
---------------------------------------------------分割线---------------------------------------------------
通过我半小时的努力,算的我头昏脑胀之后,终于写出来了,啥都不说了,直接看代码吧:
#include <iostream>
#include <iomanip>
using namespace std;
int total=15;
int **ta;
static int value=1;
static int num=0;
int elenum(int n)
{
if(n==1)return 1;
return n+elenum(n-1);
}
void test(int *a[],int n)
{
if(n<1)return;
int i,j;
for(i=num;i<n;i++)
{
if(value>elenum(total))return;
a[num][i]=value++;
}
for(j=n-2,i=num+1;j>=num;j--,i++)
{
if(value>elenum(total))return;
a[i][j]=value++;
}
for(i=n-2;i>num;i--)
{
if(value>elenum(total))return;
a[i][num]=value++;
}
num++;
test(ta,n-2);
}
int main(int argc, char* argv[])
{
ta=(int**)malloc(sizeof(int*)*total);
for(int i=0;i<total;i++)
{
ta[i]=(int*)malloc(sizeof(int)*total);
}
for(i=0;i<total;i++)
for(int j=0;j<total;j++)
ta[i][j]=0;
test(ta,total);
for(i=0;i<total;i++)
{
for(int j=0;j<total;j++)
{
if(ta[i][j]==0)continue;
cout<<std::setw(5)<<ta[i][j];
}
cout<<endl;
}
}
------------------------------分割线------------------------------
以下是结果:
代码中有不懂的地方或者用什么bug可以写邮件到490733206@qq.com,3Q。
--By[root@尘ぜ]#