问题描述
输入一个整数 n ( n ≤ 20 ) n(n \le 20) n(n≤20),在 n × n n \times n n×n的方阵里填入数字 1 , 2 , 3 , . . . , n × n 1,2,3,...,n \times n 1,2,3,...,n×n,使之构成蛇形。
输入格式
一行一个整数 n n n。
输出格式
n × n n \times n n×n 的蛇形矩阵。
样例
样例输入1
4
样例输出1
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
数据范围
1 ≤ n , m ≤ 20 1 \le n, m \le 20 1≤n,m≤20
思路
模拟填数的过程。
从
1
1
1 开始,到
n
×
n
n \times n
n×n 结束,会遇到几种情况:
-
是当前层的右侧:
1.1 在右下角,转向左边循环;
1.2 在中间,向下循环; -
是当前层的下侧:
2.1 在左下角,转向上边循环;
2.2 在中间,向左循环; -
是当左层的下侧:
3.1 在左上角,转向右边循环;
3.2 在中间,向上循环; -
是当左层的下侧:
3.1 在右上角,转向下边循环,跳入下一层;
3.2 在中间,向右循环;
最后输出即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int s = 0;
int x, y;
int t;
int a[30][30];
int main(){
scanf("%d", &n);
x = n;
y = 0;
t = n;
//模拟
while(t > 0){
//右
for(int i = 1; i <= t; ++ i){
++ s;
++ y;
a[y][x] = s;
}
-- t;
//下
for(int i = 1; i <= t; ++ i){
++ s;
-- x;
a[y][x] = s;
}
//左
for(int i = 1; i <= t; ++ i){
++ s;
-- y;
a[y][x] = s;
}
-- t;
//上
for(int i = 1; i <= t; ++ i){
++ s;
++ x;
a[y][x] = s;
}
}
//输出
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}