题目描述
链接
将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”~所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充~要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值
分析
- 方法1:就是按照题意模拟,我自己想到一个切换方向的方法,但是必须初始化的时候要注意!
- 方法2:while里面套while。内层while有4个,组成了一个整体,即走了一圈,外层while表示不断走圈,直到走完
- 一直最后一个样例错!!!!!一般都是大样例!!!检查下开的数组,发现没有指定范围!!!
- 此时!!!用vector!!!
vector<int> a(N); //一维数组 vector<vector<int> > b(m, vector<int>(n)); //二维数组!!!有m行,每行是一个n列的一维数组!
- 二维数组初始化
memset(a, -1,sizeof(a)); //一样的
代码1
#include<bits/stdc++.h> using namespace std; const int maxn = 1000; int a[maxn][maxn]; bool v[maxn][maxn]; const int maxm = 1e4+10; int b[maxm]; int t,m,n; int main(){ cin>>t; for(int i=1; i<=(int)sqrt(t); i++){ if(t % i == 0) n = i; } m = t / n; for(int i=0;i<t;i++){ scanf("%d",&b[i]); } sort(b,b+t); reverse(b,b+t); int i = 0, j = -1, nxt = 0, cnt = 0; while(cnt < t){ if(nxt == 0){ j++; if(j>=n || v[i][j]){ nxt = (nxt + 1) % 4; j--; }else{ v[i][j] = 1; a[i][j] = b[cnt++]; } }else if(nxt == 1){ i++; if(i>=m || v[i][j]){ nxt = (nxt + 1) % 4; i--; }else{ v[i][j] = 1; a[i][j] = b[cnt++]; } }else if(nxt == 2){ j--; if(j<0 || v[i][j]){ nxt = (nxt+1)%4; j++; }else{ v[i][j] = 1; a[i][j] = b[cnt++]; } }else{ i--; if(i<0 || v[i][j]){ nxt = (nxt+1)%4; i++; }else{ v[i][j] = 1; a[i][j] = b[cnt++]; } } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(j!=0) printf(" "); printf("%d",a[i][j]); } printf("\n"); } }
代码2
#include<bits/stdc++.h> using namespace std; const int maxn = 1e4+10; int a[500][500]; int b[maxn]; int t,m,n; bool cmp(int x, int y){ return x>y; } int main(){ scanf("%d",&t); for(n=sqrt((double)t); n>=1; n--){ if(t % n == 0){ m = t / n; break; } } for(int i=0;i<t;i++){ scanf("%d",&b[i]); } sort(b,b+t, cmp); int i = 0, j = 0, cnt = 0; memset(a, -1, sizeof(a)); while(cnt != t){ while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i][j++]=b[cnt++]; i++, j--; while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i++][j]=b[cnt++]; i--, j--; while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i][j--]=b[cnt++]; i--, j++; while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i--][j]=b[cnt++]; i++, j++; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(j!=0) printf(" "); printf("%d",a[i][j]); } printf("\n"); } }