PAT乙级1050 螺旋矩阵
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 螺旋矩阵相关推荐
- C++学习之路 | PTA乙级—— 1050 螺旋矩阵 (25 分)(精简)
1050 螺旋矩阵 (25 分) 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋 ...
- PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解
PAT 乙级练习 题解合集 本题链接 题目 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按 ...
- 1050. 螺旋矩阵(25)-PAT乙级真题
本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...
- PAT (Basic Level) 1050 螺旋矩阵(模拟)
题目链接:点击查看 题目大意:给出N个数,降序排序后构造螺旋矩阵,要求行n和列m满足要求n*m==N并且n>m并且(m-n)尽可能小 题目分析:排序后就是简单的蛇形填数了,网上都是用一个whil ...
- 【最全解析】1050 螺旋矩阵 (25分)
立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵&q ...
- 1050 螺旋矩阵 (25 分
本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...
- 1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...
- PAT1050_乙级_螺旋矩阵
这道题折腾了好久,最后发现不是二维矩阵的相关问题,而是一个很简单的小问题 接下来为列出遇到的各种问题,并逐个分析 本题涉及的新知识点: 1.关于c语言函数在c++中的调用(头文件) #include& ...
- 【PAT乙级】1050 螺旋矩阵 (25 分)
题目地址 #include<cstdio> #include<iostream> #include<string> #include<vector> # ...
- PAT乙级题目索引(题目+解析+AC代码)
题目信息 分值 PAT 乙级 1001 害死人不偿命的(3n+1)猜想 15 PAT 乙级 1002 写出这个数 20 PAT 乙级 1003 我要通过! 20 PAT 乙级 1004 成绩排名 20 ...
最新文章
- 数学建模学习笔记——图论最短路径
- r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库
- [转载] 常用应届生Java开发笔试面试题(更新中)
- (68)信号发生器DDS协议(第14天)
- php 判断字符串为时间,检查字符串是否为unix时间戳
- pycharm远程开发
- MATLAB中按点运算“.* ./”和一般运算的区别
- JAVA注解行_java注解
- ExtJS新手调试过程
- QT自定义opengl的Widget绘制Mat
- 《一课经济学》六、政府价格管制
- 学习自旋电子学的笔记00:杂谈(闲话) OOMMF软件的安装
- 高效率的免费发布信息平台,助力企业高质量采购
- 机器人传感器网络的覆盖优化和空间负载均衡
- 《魔兽世界》10个让你感动流泪的故事
- [转] 心中永远是晴天
- Python爬取返利网(今日值得买)数据
- 再谈Android的许可证
- Matlab学习第一天(注释、输入输出、清空工作区、清屏、向量矩阵表示和运算、字符串、求和求积函数、等差数列、特征值、判断语句、循环语句)
- python 3.10.1 安装教程
热门文章
- 风道设计独特,外观简约时尚,安钛克DF 700 Flux机箱体验
- 虐心的《西部世界》第二季:我看哭了 人类和AI傻傻分不清
- 想做一个SSL代理的集群中,有很多问题需要解决,I am all grateful to you for your advice
- mysql error trace_dede源码下data/mysql_error_trace.inc日志暴露后台地址漏洞修复
- MySQL基础 - 简单查询
- PHP二次元风格发卡系统源码荔枝发卡网
- 算法竞赛命题指南(命题流程、Polygon的使用等)
- 计算机不定时黑屏,宏基acer 4736ZG不定时黑屏,时亮时不亮通病维修
- 智能网联汽车云控系统第3部分:路云数据交互规范
- 改用Hamibot-艳云脚本云控系统