---
# System prepended metadata

title: ZeroJudge a417. 螺旋矩陣
tags: [ZeroJudge, C++]

---

# ZeroJudge a417. 螺旋矩陣

[a417. 螺旋矩陣 (題目連結)](https://zerojudge.tw/ShowProblem?problemid=a417)

### 解題思路
:::info
#### 1.填表
用二維陣列儲存資料，由左上角開始填數字，接下來四個 while 分別表示 : 向右、向下、向左、向上，當 i 或 j 超出範圍或目標格已經有值時，跳出迴圈。一直重複直到全部填完。
#### 2.翻轉
若 m==2 將 matrix[i][j] 和matrix[j][i] 全部交換。
:::

### 程式碼

<font color="#00CE17">**AC**</font> **(66ms, 540KB)**

```cpp=
#include <bits/stdc++.h>
using namespace std;

#define int long long

int n, m;

bool valid(int i, int j){
	return i>=0 and i<n and j>=0 and j<n;
}

signed main(){
	
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	int t; cin>>t;
	while(t--){
		cin>>n>>m;
		vector<vector<int>> matrix(n, vector<int>(n, 0));
		int i(0), j(0), cnt(1);
		matrix[i][j]=cnt;
		while(cnt<n*n){
			while(valid(i, j+1) and matrix[i][j+1]==0) matrix[i][++j]=++cnt;
			while(valid(i+1, j) and matrix[i+1][j]==0) matrix[++i][j]=++cnt;
			while(valid(i, j-1) and matrix[i][j-1]==0) matrix[i][--j]=++cnt;
			while(valid(i-1, j) and matrix[i-1][j]==0) matrix[--i][j]=++cnt;
		}
		if(m==2)
			for(int i=0; i<n-1; i++) 
				for(int j=i+1; j<n; j++) 
					swap(matrix[i][j], matrix[j][i]);
		for(auto arr : matrix){
			for(auto val : arr) cout<<val<<setw(6); 
			cout<<'\n';
		}
		cout<<'\n';
	}
	
	return 0;
}
```
###### 闕以諾 2023/1/29
###### tags: `C++` `ZeroJudge`