【問題描述】 建立n階螺旋矩陣并輸出。
輸入描述:輸入包含多個測試用例,每個測試用例為一行,包含一個正整數n(1≤n≤50),以輸入0表示結束。
輸出描述:每個測試用例輸出n行,每行包括n個整數,整數之間用一個空格分隔。
輸入樣例:

輸出樣例:
【思路】:
如下圖所示,當 len>2 時,矩陣内層的輸出格式就和(len-2)一樣,隻是 num0 做了對應改變。
是以我們可以用遞歸的思想來處理上述問題。
【Tips】
需要注意的是,雖然輸出格式和(len-2)一樣,但輸出時的下标并未改變。
【算法流程圖】
【代碼(c++)】
#include<iostream>
using namespace std;
const int nmax = 50;
int a[nmax][nmax];//定義一個二維數組來裝數字後直接列印
int n;//參數n
/*
思路:通過分析可知“建立n階螺旋矩陣并輸出”當n>2以後可以用遞歸分為兩部分來實作,一個是外層的實作,一個是内層的遞歸
參數:
1,n
2,num0 用來确定輸出的數字
3,len 用來表示目前調用的是哪個遞歸
4, m 用來确定輸出坐标
*/
void HelixMatrix(int n, int num0, int len, int m) {
if (len == 1) {
a[m][m] = num0;
return;
}
if (len == 2) {
a[m][m] = num0++;
a[m][m + 1] = num0++;
a[m + 1][m + 1] = num0++;
a[m + 1][m] = num0;
return;
}
int x = m;//坐标最小值
int y = n + 1 - m;//坐标最大值(第一層的時候是n,第二層是n-1,第三層是n-2.......
int tmp = num0;//不要随便改變傳入參數的值
if (len >= 3) {
//上面
for (int i = x; i <= y; i++) {
a[x][i] = tmp;
tmp++;
}
//右邊
for (int i = x + 1; i <= y; i++) {
a[i][y] = tmp;
tmp++;
}
//下面
for (int i = y - 1; i >= x; i--) {
a[y][i] = tmp;
tmp++;
}
//左邊
for (int i = y - 1; i >= x + 1; i--) {
a[i][x] = tmp;
tmp++;
}
HelixMatrix(n, tmp, len-2, m+1);
}
}
int main()
{
while (1) {
cin >> n;//輸入n
if (n == 0) {//輸入0結束
printf("請輸入有效值\n");
break;
}
//調用函數
HelixMatrix(n, 1, n, 1);
//列印
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%5d", a[i][j]); //輸出右對齊
}
cout << endl;
}
printf("\n");
}
system("pause");
return 0;
}