//话说我小时候下围棋的时候玩过这个,童年啊!
我们先来手玩几组数据
n=1 1 3 2 1
n=2 2 4 5 3 1 2 4 3
n=3 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4
我们来把中间空着那个格子放到第一位,再调整一下布局。
n=1 2 13 2
n=2 3 24 531 24 3
n=3 4 35 642 1357 642 35 4
总结一下规律
1 前n+1组数每组的大小等于组序数,并且后以n+1组数为与之前对称
2 每组数内公差为2
3 奇数组为降序且首项为n+i
4 偶数组为升序且首项为n-i+2
接下来就是写程序啦
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int res[1010];
int n,tot,len;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n+1;i++)//i表示组数
{
if (!(i%2))//奇数组
for (int j=0;j<i;j++) res[++tot]=n-i+2+2*j;
else//偶数组
for (int j=0;j<i;j++) res[++tot]=n+i-2*j;
}
//输出
for (int i=2;i<=tot;i++)
{
//这里其实可以写个函数,懒得改了=。=
len++;if (len%20==0) len=0;
if (!len) printf("%d\n",res[i]);
else printf("%d ",res[i]);
}
for (int i=n;i>=1;i--)
{
for (int j=(i*i-i)/2+1;j<=(i*i+i)/2;j++)//用的是等差数列的和,(首项+尾项)*项数/2,来输出对称的第i组数
{
len++;if (len%20==0) len=0;
if (!len) printf("%d\n",res[j]);
else printf("%d ",res[j]);
}
}
return 0;
}