機試題螺旋矩陣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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章