此文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90484058

1105 Spiral Matrix (25 分)
 

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m×n must be equal to N; m≥n; and m−n is the minimum of all the possible values.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 1. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:

12
37 76 20 98 76 42 53 95 60 81 58 93

Sample Output:

98 95 93
42 37 81
53 20 76
58 60 76

题目大意:将N个数字降序顺时针螺旋放入一个矩阵,然后输出矩阵。矩阵的行列数分别为m、n,要求m*n=N 且 m≥n、m-n最小。

思路:n取N的平方根,若N能被n整除,则符合条件,若不能,则n--继续寻找。螺旋放入矩阵有四个边界:left、right、top、bottom;写四个函数在边界之内按照四个方向往矩阵放入数据,进入循环:1、从左往右,到达右边界 right 的时候,top++(上边界往下压一层);2、从上到下,到达底部,right++;3、从右往左,到达左边界,bottom++;4、从下往上,到达上边界,left++;5、若数据放完了则退出循环。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector <int> v;
int N,
index = ,
ans[][];
int getNum(int N);
bool cmp(int a, int b);
void leftToRight(int &left, int &right, int &top, int &bottom);
void topToBottom(int &left, int &right, int &top, int &bottom);
void rightToLeft(int &left, int &right, int &top, int &bottom);
void bottomToTop(int &left, int &right, int &top, int &bottom);
int main()
{
int m, n;
scanf("%d", &N);
v.resize(N);
for(int i = ; i < N; i++)
scanf("%d", &v[i]);
sort(v.begin(), v.end(), cmp);
n = getNum(N);
m = N / n;
int left = ,
right = n-,
bottom = m-,
top = ;
while(index < N){
leftToRight(left, right, top, bottom);
topToBottom(left, right, top, bottom);
rightToLeft(left, right, top, bottom);
bottomToTop(left, right, top, bottom);
}
for(int i = ; i < m; i++){
for(int j = ; j < n; j++){
printf("%d", ans[i][j]);
if(j < n-)
printf(" ");
}
printf("\n");
}
return ;
} void bottomToTop(int &left, int &right, int &top, int &bottom){
if(top > bottom || index >= N)
return;
for(int i = bottom; i>= top; i--){
ans[i][left] = v[index];
index++;
}
left++;
} void rightToLeft(int &left, int &right, int &top, int &bottom){
if(left > right || index >= N)
return;
for(int i = right; i >= left; i--){
ans[bottom][i] = v[index];
index++;
}
bottom--;
} void topToBottom(int &left, int &right, int &top, int &bottom){
if(top > bottom || index >= N)
return;
for(int i = top; i <= bottom; i++){
ans[i][right] = v[index];
index++;
}
right--;
} void leftToRight(int &left, int &right, int &top, int &bottom){
if(left > right || index >= N)
return;
for(int i = left; i <= right; i++){
ans[top][i] = v[index];
index++;
}
top++;
} int getNum(int N){
int n = sqrt(N);
while(n > ){
if(N % n == )
break;
n--;
}
return n;
}
bool cmp(int a, int b){
return a > b;
}

最新文章

  1. 【jQuery】选择器
  2. RPC hessian简单案例
  3. PHP旧系统基于命名空间重构经验
  4. 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
  5. ajax跨子域请求的两种现代方法
  6. bzoj 1934: [Shoi2007]Vote 善意的投票
  7. FFT多项式乘法加速
  8. angularJS自定义 过滤器基础
  9. 4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
  10. 【一天一道LeetCode】#136. Single Number
  11. 【死磕 Spring】----- IOC 之 注册 BeanDefinition
  12. Visual Studio 2010软件安装教程
  13. 第三次Scrum冲刺————Life in CCSU
  14. AnimationDrawable写贞动画,播放完毕停止在第一或最后一帧
  15. js中parentNode,parentElement,childNodes,children
  16. 通过Adb 查看当前正在运行的Activity.
  17. PHP CURL 抓取失败 自己调试
  18. Android仿iPhone 滚轮控件 实现
  19. 【laravel5.4】 Composer移除依赖
  20. 洛谷P1078 文化之旅

热门文章

  1. 算法(Algorithms)第4版 练习 1.3.9
  2. mooc_java 集合框架中 学生所选课程2Map&amp;HashMap
  3. DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存
  4. [原创]Java在线编辑word文档调用PageOffice实现并发控制
  5. eclipse的maven工程Dynamic Web Module 2.3 修改为3.0 解决办法
  6. L95
  7. 书写优雅的shell脚本(八)- 日期格式化
  8. star score
  9. BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)
  10. HihoCoder1651 : 小球染色([Offer收割]编程练习赛38)(DP的优化)