# Array# Simulation# Matrix

a417 - 螺旋矩陣

🔗 前往 ZeroJudge 原題

題目描述

題目要求輸出一個 N x N 的螺旋矩陣,矩陣中的數字按照螺旋順序填充,從 1 開始到 N*N。同時,題目還要求根據輸入的方向 (M=1 為順時針,M=2 為逆時針) 輸出矩陣,並以固定的寬度 (5) 格式化輸出每個數字。

解題思路

本題的核心在於模擬螺旋填充的過程。程式首先初始化一個 N x N 的二維陣列。然後,使用四個迴圈來填充矩陣的四個邊緣,每次填充完一層後,縮小邊界,直到所有元素都被填充。 程式使用 lv 變數來表示當前層的邊界,n 變數來表示當前要填充的數字。 對於 M=1 (順時針) 的情況,程式按照上 -> 右 -> 下 -> 左 的順序填充矩陣。 對於 M=2 (逆時針) 的情況,程式按照上 -> 左 -> 下 -> 右 的順序填充矩陣。 最後,程式根據輸入的方向 (M) 輸出矩陣。如果 M=1,則按行輸出;如果 M=2,則按列輸出。

複雜度分析

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

程式碼

#include <iostream>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    cin.tie(NULL);
	int a,c;cin >> c;
	while(cin >> a >> c){
		int b[a][a];
		if(a%2==1)
			b[a/2][a/2]=a*a;
		int lv=0,n=1,j;
		for(;n<a*a;lv++){
			for(j=lv;j<a-1-lv;j++){
				b[lv][j]=n;
				n++;
			} 
			for(j=lv;j<a-1-lv;j++){
				b[j][a-lv-1]=n;
				n++;
			}
			for(j=a-1-lv;j>lv;j--){
				b[a-lv-1][j]=n;
				n++;
			}
			for(j=a-1-lv;j>lv;j--){
				b[j][lv]=n;
				n++;
			}
		}
		for(lv=0;lv<a;lv++){
			for(j=0;j<a;j++){
				if(c==1)
					printf("%5d", b[lv][j]);
				else
					printf("%5d", b[j][lv]);
			}
			printf("\n");
		}
	}
}

Discussion