# Simulation# Array# Spiral Traversal

a628 - 8. Number Spiral

🔗 前往 ZeroJudge 原題

題目描述

題目要求產生一個大小為 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";
	}
}

Discussion