題目描述
本題要求將給定的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;
}