PAT乙级 1050. 螺旋矩阵(25)
2017-07-31 08:06
489 查看
题目链接:https://www.patest.cn/contests/pat-b-practise/1050
时间限制
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个空格分隔,行末不得有多余空格。
输入样例:
输出样例:
分析:
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;
}这样的时候最后一个测试点过不了!
这是什么问题?需要思考。
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;
}这样的时候最后一个测试点过不了!
这是什么问题?需要思考。
相关文章推荐
- PAT乙级—1050. 螺旋矩阵(25)-native
- 乙级 PAT 1050. 螺旋矩阵(25)
- PAT乙级 1050. 螺旋矩阵(25)
- pat乙级1050. 螺旋矩阵(25)
- PAT 乙级1050. 螺旋矩阵(25)&&蛇形填数&&51Nod 1283 最小的周长
- PAT乙级1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25) PAT乙级真题
- 1050. 螺旋矩阵(25)-浙大PAT乙级真题java实现
- pat 乙级 1050. 螺旋矩阵(25)
- PAT乙级 1050. 螺旋矩阵(25)
- [PAT乙级]1050. 螺旋矩阵(25)
- pat乙级真题 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)-PAT乙级真题
- PAT-乙级-1050. 螺旋矩阵(25)
- PAT 1050. 螺旋矩阵(25)
- PAT (Basic Level) Practise (中文) 1050. 螺旋矩阵(25)
- PAT-A-1050. 螺旋矩阵(25)
- PAT Basic 1050. 螺旋矩阵(25)(C语言实现)
- PAT 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25) PAT乙级&&1105. Spiral Matrix (25)PAT甲级