PAT乙级 1050. 螺旋矩阵(25)

来源:互联网 发布:mac怎么卸载驱动 编辑:程序博客网 时间:2024/05/20 16:40

题目链接:https://www.patest.cn/contests/pat-b-practise/1050


1050. 螺旋矩阵(25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

输入格式:

输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。

输入样例:
1237 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 9342 37 8153 20 7658 60 76

分析:

1、先确定m和n的值。n是对N开方后向下依次取值确定的。

2、填充矩阵的时候,可以自己手动模拟一下,不复杂的,row为当前行,column为当前列。

#include<iostream>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int maxn=10000;int a[maxn];int cmp(int a,int b){    return a>b;}int main(){    int N;    cin>>N;    for(int i=0;i<N;i++) cin>>a[i];    int n=1,m=N;    for(int i=(int)sqrt(N);i>=1;i--){//确定m和n        if(N%i==0) {n=i;break;}    }    m=N/n;    //cout<<"m="<<m<<' '<<"n="<<n<<endl;    sort(a,a+N,cmp);    int row=0,column=0,cnt=0;    int b[m][n];    memset(b,-1,sizeof(b));    while(cnt<N){//分别为向右、向下、向左、向上        while(column<n&&b[row][column]==-1){            b[row][column]=a[cnt++];            column++;        }        column--;        row++;        while(row<m&&b[row][column]==-1){            b[row][column]=a[cnt++];            row++;        }        row--;        column--;        while(column>=0&&b[row][column]==-1){            b[row][column]=a[cnt++];            column--;        }        row--;        column++;        while(row>=0&&b[row][column]==-1){            b[row][column]=a[cnt++];            row--;        }        row++;        column++;    }    for(int i=0;i<m;i++){        for(int j=0;j<n;j++){            if(j==0) cout<<b[i][j];            else cout<<' '<<b[i][j];        }        cout<<endl;    }    return 0;}
有一个问题,我的排序的比较函数写成

int cmp(int a,int b){    if(a!=b) return a>b;}
这样的时候最后一个测试点过不了!
这是什么问题?需要思考。


原创粉丝点击