数字旋转方阵如下图所示,编程输入任意N*N的蛇阵。
1 | 20 | 19 | 18 | 17 | 16 |
2 | 21 | 32 | 31 | 30 | 15 |
3 | 22 | 33 | 36 | 29 | 14 |
4 | 23 | 34 | 35 | 28 | 13 |
5 | 24 | 25 | 26 | 27 | 12 |
6 | 7 | 8 | 9 | 10 | 11 |
本题想要通过模拟直接求解显然比较困难,但我们可以用递归的思想,分析出每一圈的填数方式其实都差不多,一个逆时针填满一圈即可,因此,递归的雏形便出现了。
构造函数原型: void fill(int number, int begin, int size)
其中, number 表示要填入的初始数据, begin 表示要填的起始位置, size 表示蛇阵的规模。
下面思考如何实现fill函数。
每次递归size减去2,一圈数字填写使用4个循环。
最终代码:
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 5 int p[20][20]; 6 7 void fill(int number, int begin, int size) 8 { 9 int row = begin, col = begin; 10 if (size == 0) 11 return; 12 if (size == 1) 13 { 14 p[begin][begin] = number; 15 return; 16 } 17 18 p[row][col] = number; //先执行一次 19 number++; 20 21 for (int i = 0; i < size - 1; i++) 22 { 23 row++; 24 p[row][col] = number; 25 number++; 26 } 27 for (int i = 0; i < size - 1; i++) 28 { 29 col++; 30 p[row][col] = number; 31 number++; 32 } 33 for (int i = 0; i < size - 1; i++) 34 { 35 row--; 36 p[row][col] = number; 37 number++; 38 } 39 for (int i = 0; i < size - 2; i++) 40 { 41 col--; 42 p[row][col] = number; 43 number++; 44 } 45 fill(number, begin + 1, size - 2); 46 } 47 48 int main() 49 { 50 int size; 51 cout << "Input N: "; 52 cin >> size; 53 54 fill(1, 0, size); 55 56 for (int i = 0; i < size; i++) 57 { 58 cout << endl; 59 for (int j = 0; j < size; j++) 60 { 61 cout << p[i][j] << '\t'; 62 } 63 } 64 system("pause"); 65 return 0; 66 }