# 實作題 - 數字龍捲風 - APCS - by Peter Wang ## 題目資訊 此題為2017.3.4測驗中的題目3 ###### tags: `APCS` ## 題目敘述 給定一個 N*N 的二維陣列,其中N是奇數,我們可以從正中間的位置開始順時 針旋轉的方式走訪每個陣列元素恰好一次。對於給定的陣列內容與起始方向,請輸出走訪順序之內容。下圖的例子顯示了N=5且第一步往左的走訪順序: ![](https://i.imgur.com/brtQmzw.png) 依此順序輸出陣列內容則可以得到 「9123857324243421496834621」。 類似地,如果是第一步向上則走訪順序下: ![](https://i.imgur.com/YIkmkKK.png) 依此順序輸出陣列內容則可以得到 「9385732124214968346214243」。 ### 輸入: 輸入 第一行 是整數 N,N為奇數且不小於 3。第二行是一個 0~3 的整數 代表起始方向, 其中 0代表左 、1代表上 、2代表右 、3代表下 。第三行開始 N行是陣列內容,順序是由上而下,左至右陣列的內容為 是由上而下,左至右陣列的內容為 是由上而下,由左至右,陣列的內容為 0~9 的整數, 同一行數字中間以一個空白間隔 。 ### 輸出: 請輸出走訪順序的陣列內容,該答案會是一連串的陣列內容,數字之間不要輸出空白,結尾有換行符號 。 ## 解題思路 找出走訪規律,利用此規律按照順序輸出。 ## 程式碼 ```clike= #include <iostream> using namespace std; int main() { int n; while(cin>>n){ int w; cin>>w; int arr[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>arr[i][j]; } } int x=0; int y=1; int z=0; int a=n/2,b=n/2; int num=n*(n-1)+1; cout<<arr[a][b]; while(x<num){ //cout<<arr[a][b]; if(z==2) y++,z=1; else z++; x++; if(w==0){ w=1; for(int i=b-1;i>=b-y;i--){ cout<<arr[a][i]; x++; } b-=y; } else if(w==1){ w=2; for(int i=a-1;i>=a-y;i--){ cout<<arr[i][b]; x++; } a-=y; } else if(w==2){ w=3; for(int i=b+1;i<=b+y;i++){ cout<<arr[a][i]; x++; } b+=y; } else{ w=0; for(int i=a+1;i<=a+y;i++){ cout<<arr[i][b]; x++; } a+=y; } } for(int i=0;i<2;i++){ if(w==0){ w=1; for(int i=b-1;i>=b-y;i--){ cout<<arr[a][i]; } b-=y; } else if(w==1){ w=2; for(int i=a-1;i>=a-y;i--){ cout<<arr[i][b]; } a-=y; } else if(w==2){ w=3; for(int i=b+1;i<=b+y;i++){ cout<<arr[a][i]; } b+=y; } else{ w=0; for(int i=a+1;i<=a+y;i++){ cout<<arr[i][b]; } a+=y; } } } } ``` ## 資料來源 [zerojudge](https://zerojudge.tw/) [題目敘述](https://zerojudge.tw/ShowProblem?problemid=c292) [原題PDF檔](https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnx6c2dpdGl0aXR8Z3g6MTRmYzQ0ZTM0MzJjZTlhYQ) ## 備註 >[name=PeterWang] >[time=Sun, Jun 13, 2021 11:35 PM]