1050 螺旋矩阵(25)

来源:互联网 发布:网络反侦查 编辑:程序博客网 时间:2024/06/04 19:09

虽然说是25分的题,而且是最后一道,但是还是很简单的,毕竟是乙级嘛。网了也有一些答案,不过方法都挺复杂,我的这方法思路比较简单。很容易理解。
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

int **Too(int x, int y, int num[]);int* fun(int N){    int *a ;    a = new int[3];    int m = 0, n = 0,x,y;    int tmp = N;    for (n = 1; n <= N; ++n){        for (m = n; m <= N; ++m){            if (m*n == N){                if (m - n < tmp){                    tmp = m - n;                    y= m;                    x= n;                }            }        }    }    a[0] = y; a[1] =x;    return a;}void PAT1050(){    //求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。     int num[12] = { 37, 76, 20, 98 ,76, 42, 53, 95, 60, 81, 58, 93 };    int N = 12,x,y,k=0;    int *tmp;    tmp = fun(N);    x = tmp[1]; y = tmp[0];    sort(num, num + 12);    reverse(num, num + 12);    int **a;    a = Too(x, y, num);    for (int i = 0; i < y; ++i){        for (int j = 0; j < x; ++j){            cout << setw(3) << a[i][j];        }        cout << endl;    }}int **Too(int x, int y, int num[]){    int **mat;    mat = new int*[y];    for (int i = 0; i < y; ++i){        mat[i] = new int[x];    }    int i, j, k = 0, m;    if (x % 2 == 0)m = x / 2;    else m = x / 2 + 1;    for (i = 0; i < m; ++i){        for (j = i; j<x - i; j++)        {            mat[i][j] = num[k++];        }        for (j = i + 1; j<y - i; j++)        {            mat[j][x - i - 1] = num[k++];        }        for (j = x - i - 2; j >= i; j--)        {            mat[y - i - 1][j] = num[k++];        }        for (j = y - i - 2; j >= i + 1; j--)        {            mat[j][i] = num[k++];        }    }    return mat;}
0 0
原创粉丝点击