機試題螺旋矩陣C++實現
阿新 • • 發佈:2019-01-01
一次機試的時候碰到了一個這樣的題目,當時卻沒有做出來,現在想想當時還是緊張了題目:輸入一個整數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;
}