题目描述
方阵的主对角线之上称为"上三角"。
请你设计一个用于填充 nn 阶方阵的上三角区域的程序。填充的规则是:使用 1,2,3.... 的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当 n=3n=3 时,输出:
1 2 3
6 4
5
当 n=4n=4 时,输出:
1 2 3 4
9 10 5
8 6
7
当 n=5n=5 时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
输入描述
要求用户输入整数 n\ (3 \leq n \leq 20)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
代码如下
#include <bits/stdc++.h>
using namespace std;
int sum, ed, st = 1, cnt = 1;
int a[21][21];
void dfs(int i, int j, int s)
{
if (cnt > sum)
{
return;
}
a[i][j] = cnt;
cnt++;
if (s == 1 && j < ed)
{
dfs(i, j + 1, 1);
}
if (s == 1 && j == ed)
{
dfs(i + 1, j - 1, 2);
}
if (s == 2 && j > st)
{
dfs(i + 1, j - 1, 2);
}
if (s == 2 && j == st)
{
st++;
ed--;
dfs(i - 1, j, 3);
}
if (s == 3 && i > st)
{
dfs(i - 1, j, 3);
}
if (s == 3 && i == st)
{
ed--;
dfs(i, j + 1, 1);
}
}
int main()
{
int n;
cin >> n;
sum = (n + 1) * n / 2;
ed = n;
dfs(1, 1, 1);
for (size_t i = 1; i <= n; i++)
{
for (size_t j = 1; j <= n; j++)
{
if (a[i][j] != 0)
{
cout << a[i][j] << ' ';
}
}
cout << endl;
}
return 0;
}