【PAT】B. Spiral Matrix (25) 1050. 螺旋矩阵(25)

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;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值