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

C++代碼

#include<bits/stdc++.h> 
using namespace std;
int main(){
    int N;
    cin>>N;
    int num[N+5];
    for(int i=0;i<N;i++)
        cin>>num[i];
    sort(num,num+N,greater<int>());
    int m=0,n=0,min=N;
    for(int i=0;i<=N;i++){
        for(int j=0;j<=i;j++){
            if(i*j==N&&(i-j)<min){//在符合條件的數中尋找差最小的數,並記錄下來
                min=i-j;
                m=i;
                n=j;
            }
        }   
    }
    int screw[m][n];//用二維數組表示螺旋矩陣
    memset(screw,0,sizeof(screw));
    int i=0,j=0,k=0;
    screw[i][j]=num[k++];//首先爲了以後賦值方便先將第一個元素賦值
    while(k<N){     //需要賦值N次
        while(j+1<n&&!screw[i][j+1])    screw[i][++j]=num[k++];//往右,如果小於邊界值並且沒有賦值過,則賦值
        while(i+1<m&&!screw[i+1][j])    screw[++i][j]=num[k++];//往下,如果小於邊界值並且沒有賦值過,則賦值
        while(j-1>=0&&!screw[i][j-1])   screw[i][--j]=num[k++];//往左,如果小於邊界值並且沒有賦值過,則賦值
        while(i-1>=0&&!screw[i-1][j])   screw[--i][j]=num[k++];//往上,如果小於邊界值並且沒有賦值過,則賦值
    }//至於爲什麼要用++j,因爲如果是j++,往下的時候,j需要減一,造成了後續的繁瑣
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(j!=0)
                cout<<" ";  //如果不是第一個元素,則元素前面應有空格
            cout<<screw[i][j];
        }       
            cout<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章