纯模拟,从(1,n)位置开始模拟,到达行边界考虑右下方是否有值,没有就右下走,有就往左走,到达列边界考虑左上方是否有值,没有就往左上方走,有就往下走
#include <stdio.h>
#include <memory.h>
using namespace std;
#define MAX 31
int n;
int a[MAX][MAX];
void Init();
void Order();
void vOut();
int main()
{
while(1==scanf("%d",&n))
{
Init();
Order();
vOut();
}
return 0;
}
void Init()
{
memset(a,0,sizeof(a));
}
void Order()
{
int i,j,dig;
dig=1;
i=1;
j=n;
a[i][j]=dig;
a[i][--j]=++dig;
a[++i][++j]=++dig;
int flag=0;
int sum=n*(n+1)/2;
while(dig<sum)
{
if(i==1)
{
if(a[i+1][j+1]!=0)
{
a[i][--j]=++dig;
flag=1; //从上往下
}
else
{
a[++i][++j]=++dig;
flag=1; //从上往下
}
}
else if(j==n)
{
if(a[i-1][j-1]!=0)
{
a[++i][j]=++dig;
flag=2; //从下往上
}
else
{
a[--i][--j]=++dig;
flag=2; //从下往上
}
}
if(flag==1)
{
a[++i][++j]=++dig;
}
else if(flag==2)
{
a[--i][--j]=++dig;
}
}
sum=n*n;
while(dig<=sum)
{
if(j==1)
{
if(a[i+1][j+1]!=0)
{
a[++i][j]=++dig;
flag=1; //从上往下
}
else
{
a[++i][++j]=++dig;
flag=1; //从上往下
}
}
else if(i==n)
{
if(a[i-1][j-1]!=0)
{
a[i][--j]=++dig;
flag=2; //从下往上
}
else
{
a[--i][--j]=++dig;
flag=2; //从下往上
}
}
if(flag==1)
{
a[++i][++j]=++dig;
}
else if(flag==2)
{
a[--i][--j]=++dig;
}
}
}
void vOut()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
for(i=1;i<=n;i++)
{
printf("====");
}
printf("\n");
}
结果显示: