a628 - 8. Number Spiral
題目描述
題目要求產生一個大小為 n x n 的數字螺旋,螺旋從中心點開始填入數字 0,然後以逆時針方向旋轉填入數字,直到填滿整個螺旋。n 是一個介於 1 和 19 之間的奇數。
解題思路
程式碼使用模擬的方式來產生數字螺旋。首先,初始化一個 20x20 的二維陣列 ans,並將中心元素設為 0。然後,使用迴圈不斷擴大螺旋,每次擴大一層。在每次擴大過程中,按照右、下、左、上的順序填入數字。最後,根據輸入的 n,輸出螺旋陣列中相應的部分。為了對齊數字,使用 setw(4) 確保每個數字佔用四個字元寬度。
複雜度分析
- 時間複雜度: O(n^2)
- 空間複雜度: O(1)
程式碼
#include <iostream>
#include <iomanip>
using namespace std;
int ans[20][20];
int main(){
int a=0,w=1,i=9,j=9,n,k=9;
ans[i][j]=a;
while(k--){
n=w;
while(n--){
j++;
a++;
ans[i][j]=a;
}
n=w;
while(n--){
i--;
a++;
ans[i][j]=a;
}
w++;
n=w;
while(n--){
j--;
a++;
ans[i][j]=a;
}
n=w;
while(n--){
i++;
a++;
ans[i][j]=a;
}
w++;
}
for(int j=0;j<20;j++){
ans[18][j]=j+342;
}
while(cin >> n){
n/=2;
for(int x=9-n;x<=9+n;x++){
for(int y=9-n;y<=9+n;y++){
cout << setw(4) << ans[x][y] ;
}
cout << "\n";
}
cout << "\n";
}
}