【PAT】【Advanced Level】1105. Spiral Matrix (25)

来源:互联网 发布:淘宝卖家插件推荐 编辑:程序博客网 时间:2024/06/07 06:01

1105. Spiral Matrix (25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrixis filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and ncolumns, where m and n satisfy the following: m*n must be equal to N; m>=n; and m-n is the minimum of all the possible values.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 104. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:
1237 76 20 98 76 42 53 95 60 81 58 93
Sample Output:
98 95 9342 37 8153 20 7658 60 76
原题链接:

https://www.patest.cn/contests/pat-a-practise/1105

思路:

先求m,n

再根据要求模拟

注意边界情况

CODE:

#include<iostream>#include<cstdio>#include<cmath>#include<vector>#include<algorithm>#define N 10010using namespace std;vector<int> t;bool cmp(int a,int b){return a>b;}int main(){int nn;scanf("%d",&nn);int m,n;for(int i=1;i*i<=nn;i++){if (nn%i==0){n=i;m=nn/i;}}//cout<<m<<" "<<n<<endl;int res[m][n];for (int i=0;i<nn;i++){int num;scanf("%d",&num);t.push_back(num);}sort(t.begin(),t.end(),cmp);int tb[2]={0,m-1},lr[2]={0,n-1};int x=0,y=0,r=0;int nx[2]={0,1};while(r<nn){res[x][y]=t[r];//cout<<x<<" "<<y<<" "<<res[x][y]<<" "<<nx[0]<<" "<<nx[1]<<endl;r++;x+=nx[0];y+=nx[1];if (y>lr[1]){y--;x++;tb[0]++;nx[0]=1;nx[1]=0;}elseif (x>tb[1]){x--;y--;lr[1]--;nx[0]=0;nx[1]=-1;}elseif (y<lr[0]){y++;x--;tb[1]--;nx[0]=-1;nx[1]=0;}elseif (x<tb[0]){x++;y++;lr[0]++;nx[0]=0;nx[1]=1;}}for (int i=0;i<m;i++){for (int j=0;j<n;j++){if (j!=0) printf(" ");printf("%d",res[i][j]);}printf("\n");}return 0;}


原创粉丝点击