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