蛇形填数
题目描述
用数字 1 , 2 , 3 , 4 , ⋯ , n 2 1,2,3,4,\cdots,n^2 1,2,3,4,⋯,n2这 n 2 n^2 n2个数,蛇形填充规模为 n 2 n^2 n2的方阵。
蛇形填充方法为:对于每一条左下-右上的斜线,从左上到右下依次编号 1 , 2 , ⋯ , 2 n − 1 1,2,\cdots,2n-1 1,2,⋯,2n−1。按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。
例如 5 × 5 5\times 5 5×5的方阵填充结果为
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
输入格式
一行,一个整数 n n n。
输出格式
n n n行 n n n列的方阵,每行的数用单个空格隔开,为填写完成的方阵。注意评测时不用加额外的空格对齐。
样例 #1
样例输入 #1
4
样例输出 #1
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
提示
1 ≤ n ≤ 10 1\le n \le 10 1≤n≤10。
答案
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[11][11],cnt=1,x,y;
cin >> n;
for(int i=1;i<=n;i++){
if(i%2==1){
for(int j=1;j<=i;j++){
a[i-j+1][j] = cnt;
cnt++;
}
}
else{
for(int j=i;j>=1;j--){
a[i-j+1][j] = cnt;
cnt++;
}
}
}
if(n%2==0){
for(int i=n+1;i<=n*2-1;i++){
if(i%2==1){
for(int j=i-n+1;j<=n;j++){
a[i-j+1][j] = cnt;
cnt++;
}
}
else{
for(int j=n;j>=i-n+1;j--){
a[i-j+1][j] = cnt;
cnt++;
}
}
}
}
else{
for(int i=n+1;i<=n*2-1;i++){
if(i%2==1){
for(int j=i-n+1;j<=n;j++){
a[i-j+1][j] = cnt;
cnt++;
}
}
else{
for(int j=n;j>=i-n+1;j--){
a[i-j+1][j] = cnt;
cnt++;
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}