经典的数字旋转方阵问题,怎么解决呢?
当然是递归一下,如下图,将方阵分成A,B,C,D四部分;
A 部分:每次随着数字 number 的增加,行号 i 也随之增加,列号 j 保持不变,填充到二维数组 data 中;
B 部分:每次随着数字 number 的增加,行号 i 保持不变,列号 j 随之增加,填充到二维数组 data 中;
C 部分:每次随着数字 number 的增加,行号 i 不断递减,列号 j 保持不变,填充到二维数组 data 中;
D 部分:每次随着数字 number 的增加,行号 i 保持不变,列号 j 不断递减,填充到二维数组 data 中。
除了注意到这些规律,还应该发现,每个区域只填充 方阵宽度 size - 1 。
完整代码如下:
#include <iostream>
#include <string.h>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
// 输入:当前层左上角要填写的数字 number
// 左上角坐标 begin 方阵的阶数 size
int data[8][8];
void Full(int number, int begin, int size) {
if(size == 0) {
return;
}
if(size == 1) {
data[begin][begin] = number;
return;
}
int i = begin, j = begin;
for(int k = 0; k < size - 1; k++) {
data[i][j] = number;
number++, i++;
}
for(int k = 0; k < size - 1; k++) {
data[i][j] = number;
number++, j++;
}
for(int k = 0; k < size - 1; k++) {
data[i][j] = number;
number++, i--;
}
for(int k = 0; k < size - 1; k++) {
data[i][j] = number;
number++, j--;
}
Full(number, begin+1, size-2);
}
int main(){
int num = 0, start = 0, sizee = 0;
cout << "请输入左上角的数字:" << endl;
cin >> num;
cout << "请输入左上角的坐标:" << endl;
cin >> start;
cout << "请输入方阵的阶数:" << endl;
cin >> sizee;
Full(num, start, sizee);
cout << "构造的数字旋转矩阵如下:" << endl;
for(int i = 0; i <= sizee; i ++) {
for(int j = 0; j <= sizee; j++) {
if(i == 0 || j == 0) {
if(i == 0 && j != 0) {
printf("\t第%d列", j);
}
else if(j == 0 && i != 0) {
printf("\t第%d行", i);
}
else {
printf("\t");
}
}
else {
printf("\t%d", data[i][j]);
}
}
cout << endl;
cout << endl;
}
return 0;
}
效果图如下: