您的位置:首页 > 其它

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

2017-07-31 08:06 489 查看
题目链接: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个空格分隔,行末不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:
98 95 93
42 37 81
53 20 76
58 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]
;
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;
}这样的时候最后一个测试点过不了!

这是什么问题?需要思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: