# Array# Simulation# Spiral

b580 - 一條蛇

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一條螺旋狀的蛇,蛇的寬度由輸入決定。輸出蛇的數字排列,數字按照螺旋順序遞增。

解題思路

這題的核心在於模擬螺旋填數的過程。程式首先預先計算好蛇的數字排列,儲存在一個二維陣列 ans 中。然後,根據輸入的蛇的寬度,從陣列中提取出對應大小的子矩陣並輸出。螺旋填數的邏輯是:先向右,再向下,再向左,再向上,重複這個過程直到填滿整個矩陣。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是蛇的寬度。預先計算陣列需要 O(n^2) 的時間,輸出子矩陣也需要 O(n^2) 的時間。
  • 空間複雜度: O(n^2),用於儲存蛇的數字排列的二維陣列 ans

程式碼

#include <iostream>
#include <iomanip>
using namespace std;
int ans[105][105];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int a(1),w(0),i(51),j(51),n,k(51),na;
	ans[i][j]=1;
	while(k--){
		n=++w;
		while(n--)
			ans[i][++j]=++a;
		n=w;
		while(n--)
			ans[--i][j]=++a;
		n=++w;
		while(n--)
			ans[i][--j]=++a;
		n=w;
		while(n--)
			ans[++i][j]=++a;
	}
	cin >> n;
	while(cin >> n){
		n>>=1;
		na=51+n;
		n=51-n;
		for(int x(n);x<=na;++x){
			for(int y(n);y<=na;++y)
				cout << setw(5) << ans[x][y] ;
			cout << "\n";
		}
		cout << "\n";
	}
}

Discussion