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,有限状态机,右,下,左,上
#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)[n] = new int[m][n];
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;
}