# Array# Simulation# Matrix

e974 - 座位安排 (Seats)

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個矩陣的維度 (a, b) 和一個旋轉次數 c。矩陣中的元素初始值為 1 到 a * b 的連續整數,按照列優先的順序填入。每次旋轉,矩陣的最右邊一列會移動到最左邊,或者最下面一行會移動到最上面。要求輸出旋轉 c 次後的矩陣。

解題思路

這題的核心是模擬矩陣旋轉的過程。根據旋轉次數 c 的奇偶性,決定每次旋轉是將最右邊一列移動到最左邊,還是將最下面一行移動到最上面。

  • 如果 c 是奇數,則執行列旋轉:將最右邊一列的元素儲存到一個臨時陣列,然後將其他列的元素向右移動一位,最後將臨時陣列的元素填入最左邊一列。
  • 如果 c 是偶數,則執行行旋轉:將最下面一行的元素儲存到一個臨時陣列,然後將其他行的元素向下移動一位,最後將臨時陣列的元素填入最上面一行。 重複以上步驟 c 次,即可得到旋轉後的矩陣。

複雜度分析

  • 時間複雜度: O(a * b * c),其中 a 和 b 是矩陣的維度,c 是旋轉次數。因為每次旋轉都需要遍歷整個矩陣。
  • 空間複雜度: O(max(a, b)),因為需要使用臨時陣列來儲存旋轉時的元素。臨時陣列的大小取決於矩陣的行數和列數的最大值。

程式碼

#include <iostream>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int a,b,c,w=0;
	cin >> a >> b >> c;
	int sit[a][b],n=1,right[a],back[b];
	for(int i=0;i<a;i++)
		for(int j=0;j<b;j++)
			sit[i][j]=n++;
	while(++w!=c){
		if(w&1){
			for(int i=0;i<a;i++)
				right[i]=sit[i][b-1];
			for(int j=b-2;j>=0;j--)
				for(int i=0;i<a;i++)
					sit[i][j+1]=sit[i][j];	
			for(int i=0;i<a;i++)
				sit[i][0]=right[i];
		}
		else{
			for(int j=0;j<b;j++)
				back[j]=sit[a-1][j];
			for(int i=a-2;i>=0;i--)
				for(int j=0;j<b;j++)
					sit[i+1][j]=sit[i][j];	
			for(int j=0;j<b;j++)
				sit[0][j]=back[j];
		}
	}
	for(int i=0;i<a;i++){
		for(int j=0;j<b;j++)
			cout << sit[i][j] << " ";
		cout << "\n";
	}
}

Discussion