1050. 螺旋矩阵(25)
Posted 一只菜鸡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1050. 螺旋矩阵(25)相关的知识,希望对你有一定的参考价值。
1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行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
#include <iostream> #include <iomanip> #include <math.h> #include <stdio.h> #include <string> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> using namespace std; bool comp(int a, int b) { return a > b; } int main() { int N; scanf("%d", &N); int a[N]; for (int i = 0; i<N; i++) { scanf("%d", &a[i]); } sort(a, a+N, comp); int row = ceil(sqrt(N)); while (N%row != 0) { row++;//ROW即为从SQRT开始的最小的能整数N的整数 } int col = N / row; int b[row][col]; for (int i = 0; i<row; i++) { for (int j = 0; j<col; j++) { b[i][j] = 0; } } // 二维数组初始化 int i = 0, j = 0; int count = 0; while (count != N) { for (; j<col; j++) { if (!b[i][j]) { b[i][j] = a[count++]; } else { break; } } // 向右走 j--; // 退出不满足的列 i++; // 进入下一行 for (; i<row; i++) { if (!b[i][j]) { b[i][j] = a[count++]; } else { break; } } // 向下走 i--; // 退出不满足的行 j--; // 进入下一列 (向左) for (; j >= 0; j--) { if (!b[i][j]) { b[i][j] = a[count++]; } else { break; } } // 向左走 i--; // 进入下一行 (向上) j++; // 退出不满足的列 for (; i >= 0; i--) { if (!b[i][j]) { b[i][j] = a[count++]; } else { break; } } // 向上走 i++; // 退出不满足的行(下一步向右) j++; // 进入下一列(向右) } for (int i = 0; i<row; i++) { for (int j = 0; j<col; j++) { printf("%d", b[i][j]); if (j < col - 1) { printf(" "); } } printf("\n"); } system("pause"); return 0; }
以上是关于1050. 螺旋矩阵(25)的主要内容,如果未能解决你的问题,请参考以下文章