题目:
按以下示例方阵格式,生成一个由自然数1至N^2组成的N阶方阵。
1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 24
15 16 22 23 25
注:N不仅限于5。
/************************************************************************/
/*
不借助数组,解决 n*n蛇形矩阵
把正方形转下倒置成菱形 层
1 1
2 3 2
6 5 4 3
7 8 9 10 4
15 14 13 12 11 5
16 17 18 19 4
22 21 20 3
23 24 2
25 1
*/
/************************************************************************/
#include "iostream"
using namespace std;
//表示上下层,0表示上斜层,1表示下斜层
int updownCeng=0;
//返回1~N的和
int getNSum(int num)
{
if (num<=0)
{
return 0;
}
int i=1;
int temp=0;
for (i=1;i<=num;i++)
{
temp+=i;
}
return temp;
}
//通过X,Y获取是哪层的(斜层)
int getCeng(int x,int y,int Nnum)
{
if (x+y+1>Nnum)
{
updownCeng=1;
return Nnum*2-(x+y+1);
}else
{
updownCeng=0;
return x+y+1;
}
}
//通过层数获取该层的起始数字
int getStartNum(int cengN,int Nnum)
{
if (updownCeng==0)
{
//上斜层
return getNSum(cengN-1)+1;
}else
{
int tempSum=getNSum(Nnum);
int i=0;
for (i=cengN+1;i<Nnum;i++)
{
tempSum+=i;
}
return tempSum+1;
}
}
int main()
{
cout<<"请输入N:";
int Nnum=0;
cin>>Nnum;
int i,j;
for (i=0;i<Nnum;i++)
{
for (j=0;j<Nnum;j++)
{
//步骤1:先通过X,Y值获得处于哪一层。并判断上下斜层
int cengNum=getCeng(i,j,Nnum);
int numToPrint=0;
//步骤2:获取该层数列中第一个数
numToPrint=getStartNum(cengNum,Nnum);
//步骤3:判断该层是奇偶数,(奇数就正过来输出,偶数就反过来输出)
if (cengNum%2==1)
{
//层数为奇数
if (numToPrint==1)
{
printf("%5d",numToPrint);
//cout<<numToPrint<<" ";
}else
{
//步骤4:判断该层是上下层,因为通过j(也就是Y)值来确定要输出的数处于该数列的哪个位置。
if (updownCeng==0)
{
numToPrint=numToPrint+cengNum-1-j;
}else
{
numToPrint=numToPrint+cengNum-1-j+(Nnum-cengNum);
}
//步骤5:输出
printf("%5d",numToPrint);
//cout<<numToPrint<<" ";
}
}else
{
//层数为偶数
if (updownCeng==0)
{
numToPrint=numToPrint+j;
}else
{
numToPrint=numToPrint+j-(Nnum-cengNum);
}
printf("%5d",numToPrint);
//cout<<numToPrint<<" ";
}
}
cout<<endl;
}
cin>>Nnum;
}