您的位置:首页 > 编程语言 > C语言/C++

1050. 螺旋矩阵(25) PAT

2017-05-25 22:39 453 查看


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


#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#define MAX 12000
using namespace std;

int main(){
int N;
int a[MAX];
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
sort(a,a+N);
int m,n;
n=sqrt(N);
m=N/n;
while(m*n!=N){
n--;
m=N/n;
}

int zuo=0,you=n-1,shang=0,xia=m-1;
int b[10000][120];
int r_tag=0,c_tag=0;
int fx=1;
for(int i=N-1;i>=0;i--){
if(fx==1){
b[r_tag][c_tag]=a[i];
//printf("b[%d][%d]=%d\n",r_tag,c_tag,b[r_tag][c_tag]);
c_tag++;
if(c_tag>you){
//you--;
shang++;
c_tag--;
r_tag++;
fx=2;
}
}else if(fx==2){
b[r_tag][c_tag]=a[i];
//printf("b[%d][%d]=%d\n",r_tag,c_tag,b[r_tag][c_tag]);
r_tag++;
if(r_tag>xia){
//xia--;
you--;
r_tag--;
c_tag--;
fx=3;
}
}else if(fx==3){
b[r_tag][c_tag]=a[i];
//printf("b[%d][%d]=%d\n",r_tag,c_tag,b[r_tag][c_tag]);
c_tag--;
if(c_tag<zuo){
xia--;

c_tag++;
r_tag--;
fx=4;
}
}else if(fx==4){
b[r_tag][c_tag]=a[i];
//printf("b[%d][%d]=%d\n",r_tag,c_tag,b[r_tag][c_tag]);
r_tag--;
if(r_tag<shang){
zuo++;
r_tag++;
c_tag++;
fx=1;
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j==0){
printf("%d",b[i][j]);
}else{
printf(" %d",b[i][j]);
}
}
printf("\n");
}

return 0;
}


最后一个测试用例可能会出现段错误。

原因是创建的二维数组的行数没有开够。

同样的错误犯了两次,海燕啊,你可长点心呐。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT 考研机试