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<int> > b(m,vector<int>(n)):定义一个m*n大小的vector容器。另外也可以动态变量(现在还不会,没看懂),也可以在全局变量定义一个很大的数组。
 2. 关于找m,n:从sqrt(N)向前找。
 3. 关于填充方法:[矩形法](https://www.liuchuo.net/archives/2070),寻找四个角的规律。[碰壁法](http://www.cnblogs.com/zhien-aa/p/5671115.html),遇到已经填充的格子改变方向。
 4. 大神博客:https://me.csdn.net/oliver__lew。
 5. 错误分析:一开始想用模拟,结果模拟错误。

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务