【问题描述】

蛇形填数

在n×n方阵里填入1,2,…,n×n,要求填成蛇形。例如,n=4时方阵为:

1
2
3
4
5
6
7
 1  2  3  4

12 13 14 5

11 16 15 6

10 9 8 7

为了美化效果,我们设置每个数宽度为4,填充符号为*。先输入n值,n≤10。

【样例输入】

1
4

【样例输出】

1
2
3
4
5
6
7
***1***2***3***4

**12**13**14***5

**11**16**15***6

**10***9***8***7

分析:

总循环次数为n / 2,每一次循环打印一圈,每一圈分为四条边,每条边的定位和长度与循环的当前次数关联

ps:使用动态二维数组可以保证n的值随意设定;要使用普通二维数组的话把num重新定义并删除初始化动态二维数组即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
int n, res = 1;
vector<vector<int>> num;
vector<int> temp;
cin >> n;
// 初始化动态二维数组
for (int i = 0; i < n; ++i)
{
temp.clear();
for (int j = 0; j < n; ++j)
{
temp.push_back(0);
}
num.push_back(temp);
}

for (int i = 0; i <= n / 2; ++i) // 总循环圈数
{
for (int j = i; j < n - i - 1; ++j)
{
num[i][j] = res++;
} // 上边
for (int j = i; j < n - i - 1; ++j)
{
num[j][n - i - 1] = res++;
} // 右边
for (int j = n - i - 1; j > i; --j)
{
num[n - i - 1][j] = res++;
} // 下边
for (int j = n - i - 1; j > i; --j)
{
num[j][i] = res++;
} // 左边
}
if (n % 2 != 0)
num[n/2][n/2] = res; // n为奇数时正中间的数字未赋值就会退出循环,在此补上

for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << setw(4) << setfill('*') << right << num[i][j];
}
cout << endl;
}

return 0;
}