题意:给出含N个数的序列,要求把这N个数按从大到小的顺序顺时针填入m*n的矩阵中,m,n需满足m*n=N,同时m>=n且m-n尽量小。
思路:我是按如下的方式,先从左往右把第1层填满,然后从第2层到倒数第2层把最右侧填满。。。
然后设置flag来标记当前是第几圈,因为每一圈上下左右边界是变化的,如第一圈从左到右的边界是[0,n-1],第二圈(如果有的话)则是[1,n-2],用这个flag方便控制边界的变化,具体的看看代码,手动模拟即可。
注意:在for循环内不要忘记加idx<cnt进行控制!如3*1这种只有一列矩阵,不需要走完4个for循环就已经填满了。
代码:
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int N=10005; int data[N]; int matrix[100][100];//这个大小是随便定的,然后就过了。。。说明PAT的样例不够多啊 bool cmp(int a,int b){ return a>b; } int main() { //freopen("pat.txt","r",stdin); int cnt,m,n;//m行n列 scanf("%d",&cnt); m=sqrt(cnt); while(cnt%m!=0) m--; n=cnt/m; if(m<n) swap(m,n); for(int i=0;i<cnt;i++) scanf("%d",&data[i]); sort(data,data+cnt,cmp); int flag=0,idx=0; while(idx<cnt){ for(int col=flag;col<n-flag && idx<cnt;col++) matrix[flag][col]=data[idx++]; for(int row=flag+1;row<m-1-flag && idx<cnt;row++) matrix[row][n-1-flag]=data[idx++]; for(int col=n-1-flag;col>=flag && idx<cnt;col--) matrix[m-1-flag][col]=data[idx++]; for(int row=m-2-flag;row>=flag+1 && idx<cnt;row--) matrix[row][flag]=data[idx++]; flag++; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ printf("%d",matrix[i][j]); if(j<n-1) printf(" "); else printf("\n"); } } return 0; }
原文地址:https://www.cnblogs.com/kkmjy/p/9556350.html
时间: 2024-07-30 15:29:10