【PAT】1105. Spiral Matrix

来源:互联网 发布:先进先出算法流程图 编辑:程序博客网 时间:2024/06/01 08:57

考查点:模拟题,蛇形填数

思路:这里经过四个循环后除了更新边界外还必须i++,j++,进入内层,以后模拟时不能只停在一个循环,应该第二层循环,第二是中间数的处理,对于正方形中间数必须在过四个循环之后单独处理,即在最后赋值给中间位置

#define LOCAL#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#define FOR(i, x, y) for(int i = x; i <= y; i++)#define rFOR(i, x, y) for(int i = x; i >= y; i--)#define MAXN 10010#define oo 0x3f3f3f3fusing namespace std;int a[MAXN];int ans[MAXN][MAXN];bool cmp(int a,int b){    return a>b;}int main(){     #ifdef LOCAL        freopen("data.in","r",stdin);        freopen("data.out","w",stdout);    #endif // LOCAL    int N;    cin>>N;    FOR(i,0,N-1)    scanf("%d",&a[i]);    if(N==1){        printf("%d",a[0]);return 0;    }    sort(a,a+N,cmp);    int n,m;    m=(int)ceil(sqrt(1.0*N));    while(N%m!=0){        m++;    }    n=N/m;    int cnt=0;    int i=0,j=0;    int L=1,R=n-1,U=1,D=m-1;    while(cnt<N){        while(cnt<N&&j<R){            ans[i][j++]=a[cnt++];        }        R--;        while(cnt<N&&i<D){            ans[i++][j]=a[cnt++];        }        D--;        while(cnt<N&&j>=L){            ans[i][j--]=a[cnt++];        }        L++;        while(cnt<N&&i>=U){            ans[i--][j]=a[cnt++];        }        U++;        j++;        i++;        if(cnt==N-1)ans[i][j]=a[cnt++];    }    FOR(i,0,m-1)    FOR(j,0,n-1)    {        printf("%d",ans[i][j]);        if(j<n-1){            printf(" ");        }else printf("\n");    }    return 0;}


0 0