当前位置: 代码迷 >> 综合 >> PAT 1050 螺旋矩阵 (25 分)
  详细解决方案

PAT 1050 螺旋矩阵 (25 分)

热度:99   发布时间:2023-11-24 12:10:51.0

题目传送门<==戳这
在这里插入图片描述

如图所示:
我们将填写顺序分解为一圈一圈(level)。
而每一个level 又分为4个部分(根据n的不同,最后一个level不一定有4个部分,但是不影响),分别对应于相同颜色的4个箭头。

1.如何求level(圈数):
多画几个图会发现,圈数和 “ 短的 ” 紧密相关,也就是和 lie 相关(不妨花点时间画一画),能够得出规律:level = (int)( lie / 2 + 0.5),(即 lie / 2 的值向上取整)

2.如何求行(hang) 和 列(lie):
开始令lie=sqrt(n),因为lie <= hang,所以让lie每次循环都减1,直到n % lie == 0时,有hang = n / lie。

理解基本原理之后,上代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e4+5;
int a[maxn][maxn];
int f[maxn];
bool cmp(int h,int k){
    return h>k;
}
int main(){
    int n;cin>>n;for(int i=1;i<=n;i++) scanf("%d",&f[i]);int lie=sqrt(n),hang;						==>求hang 和 liefor(;lie>=1;lie--){
    if(n%lie==0){
    hang=n/lie;break;}}int pos=0;sort(f+1,f+1+n,cmp);						==>排序int level=(lie/2.0+0.5);					for(int i=1;i<=level;i++){
                      ==>这个循环是关键所在,要多琢磨一下哦for(int j=i;j<=lie-i+1 && pos<=n-1;j++) a[i][j]=f[++pos];for(int j=i+1;j<=hang-i && pos<=n-1;j++) a[j][lie-i+1]=f[++pos];for(int j=lie-i+1;j>=i && pos<=n-1;j--) a[hang-i+1][j]=f[++pos];for(int j=hang-i;j>=i+1 && pos<=n-1;j--) a[j][i]=f[++pos];}for(int i=1;i<=hang;i++){
    					==>正常输出for(int j=1;j<=lie;j++){
    printf("%d",a[i][j]);if(j!=lie) putchar(' ');}putchar('\n');}
}