1. 程式人生 > >機試題螺旋矩陣C++實現

機試題螺旋矩陣C++實現


一次機試的時候碰到了一個這樣的題目,當時卻沒有做出來,現在想想當時還是緊張了

題目:輸入一個整數n,要求能夠打印出一個這樣的矩陣,以n=5為例,輸出如下矩陣
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

可以發現,當n為奇數的時候,“回”形圈有(n+1)/ 2個,當n為偶數的時候,“回”形圈有n / 2個,這個矩陣是順時針轉的,這裡比較簡單的處理是按照每一圈進行處理。每一圈有四個過程,首先是上面的向右走,到了邊界停下,然後是向下走,到了邊界停下,然後向左,向上。這裡的邊界與圈數有關,第 i 圈的邊界為n-circle,circle為圈數。並且在處理完上面的一行之後,即1 2 3 4 5,再處理右邊的邊界5 6 7 8 9時,第一個元素已經處理完了,這裡要注意一下。


程式碼實現

    #include<iostream>
#include<time.h> using namespace std; void Sprialarr(int n) { int i; int **a = new int*[n]; for(i = 0;i < n;i++) a[i] = new int[n]; int circle = 0; int col =0 ,raw = 0, k = 1; while(circle < (n + 1) / 2) { for
(;col < n - circle;col++)//處理上面的一行 a[raw][col] = k++; col--;//col此時等於n - circle,需要減1保持在邊界上 k--;// for(;raw < n - circle;raw++)//處理右邊的一行 a[raw][col] = k++;//第一個數重複賦值了,所以上面的k要減一個 raw--; k--; for(;col >= circle;col--)//處理下面的一行 a[raw][col] = k++; col++; k--; for(;raw > circle;raw-- )//處理左邊的一行 a[raw][col] = k++; raw++; k--; circle++; } for(raw = 0;raw < n;raw++) { for(col = 0;col < n ;col++) { cout<<a[raw][col]<<" "; } cout<<endl; } for(i = 0;i < n;i++) delete [] a[i]; delete [] a; } void test() { int n; cout<<"Input the number n"<<endl; cin>>n; Sprialarr(n); } int main() { test(); return 0; }