PAT(Basic Level)_1050_螺旋矩阵

来源:互联网 发布:分水岭算法 编辑:程序博客网 时间:2024/05/16 23:56
#include<cstdio>#include<cmath>#include<algorithm>#include<functional>using namespace std;int main(){    int N,m,n,nums[10000];    scanf("%d",&N);    for(int i=0;i<N;i++){        scanf("%d",nums+i);    }    sort(nums,nums+N,greater<int>());    //for(int i=0;i<N;i++) printf("%d ",nums[i]);     for(int i=sqrt(N);i>0;i--){        if(N%i==0){            n=i;            m=N/n;            break;        }    }    //printf("%d %d",m,n);    int **matrix=new int*[m];    for(int i=0;i<m;i++){        matrix[i]=new int[n];    }    for(int i=0;i<m;i++){        for(int j=0;j<n;j++){            matrix[i][j]=0;        }    }    int i=0,dir=0,x=0,y=0;    while(i<N){        if(!matrix[x][y]) matrix[x][y]=nums[i++];        switch(dir){            case 0:                if(y+1<n && !matrix[x][y+1]) y++;                else dir=1;                break;            case 1:                if(x+1<m && !matrix[x+1][y]) x++;                else dir=2;                break;            case 2:                if(y-1>=0 && !matrix[x][y-1]) y--;                else dir=3;                break;            case 3:                if(x-1>=0 && !matrix[x-1][y]) x--;                else dir=0;                break;        }    }    for(int i=0;i<m;i++){        for(int j=0;j<n;j++){            printf("%d",matrix[i][j]);            if(j==n-1) putchar('\n');            else putchar(' ');        }    }    for(int i=0;i<m;i++){        delete[]matrix[i];    }    delete[]matrix;    return 0;}