引自免费微信小程序:皆我百晓生
为了帮助您解决这两个题目,我会提供一个通用的C++代码示例,可以用来实现两种不同方向的蛇形填充。
以下是题目1的代码,从右上角开始填充,逆时针方向移动:
#include <iostream>
using namespace std;
void fillSerpentine(int n) {
int arr[n][n];
int num = 1;
for (int i = 0; i < n; ++i) {
for (int j = i; j >= 0 && j < n - i; ++j) {
if (i % 2 == 0) { // 偶数行
arr[i][j] = num++;
} else { // 奇数行
arr[i][j] = num--;
}
}
}
// 输出矩阵
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main() {
int n;
cin >> n;
fillSerpentine(n);
return 0;
}
这段代码首先定义了一个fillSerpentine
函数,它接受一个整数参数n
表示矩阵的大小。然后我们创建一个arr
二维数组,并初始化数字num
为1,用于填充矩阵。接下来,我们通过两个嵌套循环遍历矩阵中的每个位置。奇数行(按行索引i
判断)从左到右填充递减的数字,偶数行则从右到左填充递增的数字。最后,我们在main
函数中读取用户输入并调用fillSerpentine
函数。
对于题目2,我们需要稍微调整一下逻辑,使其从左上角开始填充,顺时针方向移动。下面是相应的代码:
void fillSerpentine_v2(int n) {
int arr[n][n];
int num = 1;
for (int i = 0; i < n; ++i) {
for (int j = i; j >= 0 && j < n - i; ++j) {
if (i % 2 == 1) { // 奇数行
arr[i][j] = num++;
} else { // 偶数行
arr[i][j] = num--;
}
}
}
// 输出矩阵
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
这个版本的fillSerpentine_v2
函数与之前的函数非常相似,只是将判断奇偶行的条件从i % 2 == 0
更改为i % 2 == 1
。其余部分保持不变。
您可以根据需要选择其中一个函数进行编译和运行。这两个函数都可以满足题目要求,并且在main
函数中可以根据需要调用不同的函数。例如,如果您想测试第二个题目,只需将fillSerpentine(n)
替换为fillSerpentine_v2(n)
即可。