蛇形填数(二)



2000 ms  |  内存限制: 65535



3



1 2 3 4 5 12 13 14 6 11 15 7 10 8 9

跟蛇形填数一样,只是填数要求按照三角形填。注意每组数据之间用空行隔开


第一行有一个N,表示N组测试数据

接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000

输出 输出之后填好之后的图 样例输入

2 5 4

样例输出

1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9 10 5 8 6 7




//和蛇〈一〉的思路一致,预判下一步,控制好边界 

#include<cstdio>
#include<cstring>
int a[1010][1010];
int main(){
int T,n,i,j,cnt1,cnt2,step;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
scanf("%d",&n);
cnt1=cnt2=n;
i=j=step=1;
a[1][1]=1;
while(step<=(n*n+n)/2){
while(a[i][j+1]==0&&j+1<=cnt1){
a[i][++j]=++step;
}
if(step>=(n*n+n)/2) break;
cnt1--;

while(a[i+1][j-1]==0&&i+1<=cnt2){
a[++i][--j]=++step;
}
if(step==(n*n+n)/2) break;
cnt2--;

while(a[i-1][j]==0){
a[--i][j]=++step;
if(step==(n*n+n)/2) break;
}

}
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(a[i][j]!=0){
if(j>=n&&n<=2*n-1)
printf("%d",a[i][j]);
else
printf("%d ",a[i][j]);
}
}
printf("\n");
}
}
return 0;
}