# 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`