1050 螺旋矩阵 (25 分)
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10
​4
​​ ,相邻数字以空格分隔。

输出格式:
输出螺旋矩阵。每行 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

这道题分为两步。第一步是找出m,n。第二步是将排好序的数螺旋填充进矩阵。

第一步:由于两个数相乘得到另外一个数,又想让两个数尽可能的接近。由此很容易想到正方形。此时m==n。所以n=sqrt(N),让n-- 直到N%n ==0 ,也就是m的值。

第二步:关于如何填充。我的做法是将前进的方向分为右下左上四个方向,用flag表示方向。遇到不可填充的点,也就是当a[j][k]==-1时,就转换方向。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){return a>b;
}
int main() {int i,j,k,N;cin>>N;int d[11111];for(i=0;i<N;i++){cin>>d[i];}int n=sqrt(N);while(N%n!=0){n--;}int m=N/n;sort(d,d+N,cmp);//int a[4][3];    int a[m+1][n+2]={0}; //m+1,n+2    多一行,多两列 放边界//- 0 0 0 -   //0代表可填空  -1代表越界  这边用-表示了//- 0 0 0 -//- 0 0 0 -//- 0 0 0 -//- - - - - for(i=0;i<m+1;i++){       //将边界填充为-1for(j=0;j<n+2;j++){if(i==m||j==0||j==n+1){a[i][j]=-1;}}}j=0,k=1;   //从(0,1)开始填空int flag1=1;  //默认向右int flag2=0; //向下int flag3=0; //向左int flag4=0;//向上int q=0;for(i=0;q<N;i++){    if(flag1==1){          //方向向右if(a[j][k]==0){a[j][k]=d[q++];      //d[q]是填充的数k++;}else{j=j+1;           //j,k控制坐标k=k-1;flag1=0;     //第一次遇到边界  关闭向右的方向flag2=1;    //方向改为向下}}if(flag2==1){if(a[j][k]==0){a[j][k]=d[q++];j++;}else{j=j-1;k=k-1;flag2=0;flag3=1;}}if(flag3==1){if(a[j][k]==0){a[j][k]=d[q++];k--;}else{j=j-1;k=k+1;flag3=0;flag4=1;}}if(flag4==1){if(a[j][k]==0){a[j][k]=d[q++];j--;}else{j=j+1;k=k+1;flag4=0;flag1=1;}}}for(i=0;i<m;i++){for(j=1;j<=n;j++){if(j==1){cout<<a[i][j];}else{cout<<" "<<a[i][j];}}cout<<endl;}return 0;}

PAT乙级1050 螺旋矩阵相关推荐

  1. C++学习之路 | PTA乙级—— 1050 螺旋矩阵 (25 分)(精简)

    1050 螺旋矩阵 (25 分) 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋 ...

  2. PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解

    PAT 乙级练习 题解合集 本题链接 题目 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按 ...

  3. 1050. 螺旋矩阵(25)-PAT乙级真题

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  4. PAT (Basic Level) 1050 螺旋矩阵(模拟)

    题目链接:点击查看 题目大意:给出N个数,降序排序后构造螺旋矩阵,要求行n和列m满足要求n*m==N并且n>m并且(m-n)尽可能小 题目分析:排序后就是简单的蛇形填数了,网上都是用一个whil ...

  5. 【最全解析】1050 螺旋矩阵 (25分)

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵&q ...

  6. 1050 螺旋矩阵 (25 分

    本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...

  7. 1050. 螺旋矩阵(25)

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  8. PAT1050_乙级_螺旋矩阵

    这道题折腾了好久,最后发现不是二维矩阵的相关问题,而是一个很简单的小问题 接下来为列出遇到的各种问题,并逐个分析 本题涉及的新知识点: 1.关于c语言函数在c++中的调用(头文件) #include& ...

  9. 【PAT乙级】1050 螺旋矩阵 (25 分)

    题目地址 #include<cstdio> #include<iostream> #include<string> #include<vector> # ...

  10. PAT乙级题目索引(题目+解析+AC代码)

    题目信息 分值 PAT 乙级 1001 害死人不偿命的(3n+1)猜想 15 PAT 乙级 1002 写出这个数 20 PAT 乙级 1003 我要通过! 20 PAT 乙级 1004 成绩排名 20 ...

最新文章

  1. 数学建模学习笔记——图论最短路径
  2. r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库
  3. [转载] 常用应届生Java开发笔试面试题(更新中)
  4. (68)信号发生器DDS协议(第14天)
  5. php 判断字符串为时间,检查字符串是否为unix时间戳
  6. pycharm远程开发
  7. MATLAB中按点运算“.* ./”和一般运算的区别
  8. JAVA注解行_java注解
  9. ExtJS新手调试过程
  10. QT自定义opengl的Widget绘制Mat
  11. 《一课经济学》六、政府价格管制
  12. 学习自旋电子学的笔记00:杂谈(闲话) OOMMF软件的安装
  13. 高效率的免费发布信息平台,助力企业高质量采购
  14. 机器人传感器网络的覆盖优化和空间负载均衡
  15. 《魔兽世界》10个让你感动流泪的故事
  16. [转] 心中永远是晴天
  17. Python爬取返利网(今日值得买)数据
  18. 再谈Android的许可证
  19. Matlab学习第一天(注释、输入输出、清空工作区、清屏、向量矩阵表示和运算、字符串、求和求积函数、等差数列、特征值、判断语句、循环语句)
  20. python 3.10.1 安装教程

热门文章

  1. 风道设计独特,外观简约时尚,安钛克DF 700 Flux机箱体验
  2. 虐心的《西部世界》第二季:我看哭了 人类和AI傻傻分不清
  3. 想做一个SSL代理的集群中,有很多问题需要解决,I am all grateful to you for your advice
  4. mysql error trace_dede源码下data/mysql_error_trace.inc日志暴露后台地址漏洞修复
  5. MySQL基础 - 简单查询
  6. PHP二次元风格发卡系统源码荔枝发卡网
  7. 算法竞赛命题指南(命题流程、Polygon的使用等)
  8. 计算机不定时黑屏,宏基acer 4736ZG不定时黑屏,时亮时不亮通病维修
  9. 智能网联汽车云控系统第3部分:路云数据交互规范
  10. 改用Hamibot-艳云脚本云控系统