【PAT】B. Spiral Matrix (25) 1050. 螺旋矩阵(25)
2015-12-05 22:43
393 查看
B. Spiral Matrix (25)
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
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 104. 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
解题思路:
1,先排序,然后计算m,n,最后将数填入spiral 矩阵中
2,有限状态机,右,下,左,上
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
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 104. 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
解题思路:
1,先排序,然后计算m,n,最后将数填入spiral 矩阵中
2,有限状态机,右,下,左,上
[code]#include <iostream> #include <vector> #include <algorithm> using namespace std; template<class T> bool greater1(T a1, T a2){ return a1 > a2; } template<class T> void print(T ** a, T row, T col){ for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ cout << a[i][j] << " "; } cout << endl; } } int main(){ int N; cin >> N; vector<int> a; a.resize(N); for (int i = 0; i < N; i++){ scanf("%d", &a[i]); } sort(a.begin(), a.end(), greater1<int>); // for (int i = 0; i < N; i++){ // cout << a[i] << " "; // } // cout << endl; int m, n; m = N; n = 1; int half = sqrt(N); for (int i = half; i > 0; i--){ if (N % i == 0){ n = i; m = N / i; break; } } //cout << "m = " << m << ", n = " << n << endl; int m1 = m + 2; int n1 = n + 2; //int (*flag) = new int[m] ; int ** flag; flag = new int *[m1]; for (int i = 0; i < m1; i++){ flag[i] = new int[n1]; for (int j = 0; j < n1; j++){ if (i == 0 || (i == m1 - 1) || j == 0 || (j == n1 - 1)){ flag[i][j] = 0; //边界 } else{ flag[i][j] = 1; } }// end j }// end i //print<int>(flag, m1, n1); int ** matrix; matrix = new int *[m1]; for (int i = 0; i < m1; i++){ matrix[i] = new int[n1]; } //四个状态,右,下,左,上对应1 2 3 4 int counter = 0; int total = m * n; int i = 1; int j = 1; int state = 1; while (1){ if (state == 1){ //right if (flag[i][j] == 0){ j--; i++; state = 2; } else{ matrix[i][j] = a[counter]; flag[i][j] = 0; j++; counter++; } } else if (state == 2){ //down if (flag[i][j] == 0){ j--; i--; state = 3; } else{ matrix[i][j] = a[counter]; flag[i][j] = 0; i++; counter++; } } else if (state == 3){ //left if (flag[i][j] == 0){ j++; i--; state = 4; } else{ matrix[i][j] = a[counter]; flag[i][j] = 0; j--; counter++; } } else if (state == 4){ //up if (flag[i][j] == 0){ j++; i++; state = 1; } else{ matrix[i][j] = a[counter]; flag[i][j] = 0; i--; counter++; } } else{ break; } if (counter >= total) break; }// end while for (int i = 1; i < m1 - 1; i++){ for (int j = 1; j < n1 - 1; j++){ if (j == 1){ cout << matrix[i][j]; } else{ cout << " " << matrix[i][j]; } } cout << endl; } //delete for (int i = 0; i < m1; i++){ delete[] flag[i]; delete[] matrix[i]; } delete[] flag; delete[] matrix; }
相关文章推荐
- 《python爬虫实战》:爬取图片
- VS2008调试dump文件
- Android.mk 的含义
- 如何通过UIView对象获取该对象所属的UIViewController
- Muduo 多线程模型:一个 Sudoku 服务器演变
- 【Java】StudentsInfoQuery(简单的学生信息查询系统)
- java求组合排列算法
- Java使用SAM解析XML
- BZOJ2338: [HNOI2011]数矩形
- 转换数组 Array为ArrayList
- CCNA 认证学习(二)
- spring线程池ThreadPoolExecutor配置并且得到任务执行的结果
- C的指针变量的简单介绍
- 前端行记1---less接触
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- ZYB's Game解题报告
- MongoDB学习系列(一)mongo简介及相关操作
- C++的异常捕捉
- Spring如何处理线程并发
- 统计学中数据类型与几个基本概念