题目描述
方阵的主对角线之上称为"上三角"。
请你设计一个用于填充 n 阶方阵的上三角区域的程序。填充的规则是:使用 1,2,3.... 的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当 n=3 时,输出:
1 2 3
6 4
5
当 n=4 时,输出:
1 2 3 4
9 10 5
8 6
7
当 n=5 时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
输入描述
要求用户输入整数n (3≤n≤20)。
输出描述
输出方阵的上三角部分。
要求每个数据宽度为 4,右对齐。
输入输出样例
示例
输入
9
输出
1 2 3 4 5 6 7 8 9
24 25 26 27 28 29 30 10
23 39 40 41 42 31 11
22 38 45 43 32 12
21 37 44 33 13
20 36 34 14
19 35 15
18 16
17
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include <iostream>
using namespace std;
const int N = 30;
int f[N][N];
int dx[] = {0 , 1 , -1};
int dy[] = {1 , -1 , 0};
int main()
{
int n;
cin >> n ;
int x = 0,y = 0,d = 0;
for(int i = 1 ; i <= n * (n + 1) / 2 ; i ++){
f[x][y] = i;
int a = x + dx[d];
int b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= n || f[a][b])//边界判断1.真正意义上的出界2.到了填过数字的位置
{
d = (d + 1) % 3;//到了边界转方向
a = x + dx[d];
b = y + dy[d];
}
x = a,y = b;
}
for(int i = 0;i < n; i++){
for(int j = 0;j < n - i; j++){
cout<<f[i][j]<<" ";
}
cout<<endl;
}
return 0;
}