1050. 螺旋矩阵(25)
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
分析:首先需要找到最小的m,n。方法是n从1~sqrt(N)尝试取值,如果N能被n整出,则可得m=N/n;再比较m-n与当前最小差值,若更小,则更新m,n和m-n的值。第二个输入数据无序,需要对数据进行排序。最后构造螺旋矩阵,方法是始终朝着一个方向往矩阵中填数,当碰到边界时换方向继续填数,这里的边界是指超出了矩阵范围或者是在当前方向的下一个位置已经填了数。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int data[10010]; int m,n; bool cmp(int & a,int & b) { return a>b; } int main() { int N; cin>>N; for(int i=0;i<N;i++) { cin>>data[i]; } //找到合适的m,n int min_mn=10010; for(int i=1;i<=sqrt(N);i++) { if(N%i==0&&N/i-i<min_mn) { m=N/i; n=i; min_mn=m-n; } } //申请数组内存 int **arr= new int*[m]; for(int i=0;i<m;i++) { arr[i]=new int[n]; for(int j=0;j<n;j++) { arr[i][j]=0; } } //降序排序 sort(data,data+N,cmp); //构造螺旋矩阵 int index=0; int i=0,j=0; arr[0][0]=data[0]; index++; while(index<N) { while(j+1<n&&arr[i][j+1]==0) { arr[i][j+1]=data[index]; j+=1; index++; } while(i+1<m&&arr[i+1][j]==0) { arr[i+1][j]=data[index]; i+=1; index++; } while(j-1>=0&&arr[i][j-1]==0) { arr[i][j-1]=data[index]; j-=1; index++; } while(i-1>=0&&arr[i-1][j]==0) { arr[i-1][j]=data[index]; i-=1; index++; } } //输出结果 for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(j!=0) { cout<<" "; } cout<<arr[i][j]; } cout<<endl; } }
——来自 熊猫 [http://www.cnblogs.com/xiongmao-cpp/]