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;
}
最后一个测试用例可能会出现段错误。
原因是创建的二维数组的行数没有开够。
同样的错误犯了两次,海燕啊,你可长点心呐。