# Array# Simulation# Matrix

e462 - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求輸出一個 n x n 的矩陣,矩陣中的數字按照螺旋順序填入,從 1 開始。

解題思路

這題的核心是模擬螺旋填數的過程。程式首先建立一個 n x n 的二維陣列 b。然後,根據行數的奇偶性,決定從左到右或從上到下填入數字。接著,處理剩餘的區域,同樣根據行數的奇偶性,決定從右到左或從下到上填入數字。最後,輸出整個矩陣。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(n^2)

程式碼

#include <iostream>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    cin.tie(NULL);
	int a;
	while(cin >> a){
		int b[a][a]={};
		int k=1;
		for(int i=0;i<a;i++){
			if(i%2==1){
				for(int j=0,y=i;j<=i;j++){
					b[j][y]=k;
					k++;
					y--;
				}
			}
			else{
				for(int j=0,y=i;j<=i;j++){
					b[y][j]=k;
					k++;
					y--;
				}
			}
		}
		if(a%2==0){
			for(int i=0;i<a-1;i++){
				if(i%2==1){
					for(int j=a-1,y=i+1;j>=i+1;j--){
						b[y][j]=k;
						k++;
						y++;
					}
				}
				else{
					for(int j=a-1,y=i+1;j>=i+1;j--){
						b[j][y]=k;
						k++;
						y++;
					}
				}
			}
		}
		else{
			for(int i=0;i<a-1;i++){
				if(i%2==0){
					for(int j=a-1,y=i+1;j>=i+1;j--){
						b[y][j]=k;
						k++;
						y++;
					}
				}
				else{
					for(int j=a-1,y=i+1;j>=i+1;j--){
						b[j][y]=k;
						k++;
						y++;
					}
				}
			}
		}
		for(int i=0;i<a;i++){
			for(int j=0;j<a;j++){
				cout << b[i][j] << " ";
			}
			cout << endl;
		}
	}
}

Discussion