C++|递归:数字旋转方阵(蛇阵)


数字旋转方阵如下图所示,编程输入任意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 }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM