PTA 1050 螺旋矩阵

#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std; 

bool cmp(int a,int b){
 return a>b;
}

int main(){
 int n1;
 scanf("%d",&n1);
 int m,n;
 for(int i=sqrt(n1);i>=0;i--){
  if(n1%i==0){
   m=max(i,n1/i);
   n=min(i,n1/i);
   break;
  }
 }
// cout<<m<<n;
 
 int a1[100000];
 for(int i=0;i<n1;i++)
 scanf("%d",&a1[i]);
 sort(a1,a1+n1,cmp);
// for(int i=0;i<n1;i++)
// printf("%d",a1[i]);
 
 vector<vector<int> > a(m,vector<int>(n));
 int count=1;
 int k=0;
 int t=0,i,j;
 int c=m/2+m%2;
 for(int l=0;l<c;l++){
  for(int j=l;j<=n-1-l&&k<=n1-1;j++) a[l][j]=a1[k++];
  for(int j=l+1;j<=m-2-l&&k<=n1-1;j++) a[j][n-1-l]=a1[k++];
  for(int j=n-1-l;j>=l&&k<=n1-1;j--) a[m-1-l][j]=a1[k++];
  for(int j=m-2-l;j>=l+1&&k<=n1-1;j--) a[j][l]=a1[k++];
 }
 for(int i=0;i<m;i++){
  for(int j=0;j<n;j++){
   printf("%d",a[i][j]);
   if(j!=n-1) printf(" ");
  }
  if(i!=m-1) printf("\n");
 }
 } 



知识点:

  1. 动态内存:vector二维向量:定义:vector<vector > b(m,vector(n)):定义一个m*n大小的vector容器。另外也可以动态变量(现在还不会,没看懂),也可以在全局变量定义一个很大的数组。
  2. 关于找m,n:从sqrt(N)向前找。
  3. 关于填充方法:矩形法,寻找四个角的规律。碰壁法,遇到已经填充的格子改变方向。
  4. 大神博客:https://me.csdn.net/oliver__lew。
  5. 错误分析:一开始想用模拟,结果模拟错误。

猜你喜欢

转载自blog.csdn.net/weixin_43806345/article/details/86253800