机试题螺旋矩阵C++实现

来源:互联网 发布:生产许可证编号 淘宝 编辑:程序博客网 时间:2024/04/27 07:30


一次机试的时候碰到了一个这样的题目,当时却没有做出来,现在想想当时还是紧张了

题目:输入一个整数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;    }
0 0
原创粉丝点击