PAT 1050 螺旋矩阵 25分

91 阅读1分钟

题目:1050 螺旋矩阵 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:50_哔哩哔哩_bilibili

方向我们先从右边到下边再到左边,最后往上:

image.png

#include<bits/stdc++.h>
using namespace std;
int a[105][105];

int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
 int N=0;cin>>N;
 vector<int>v(N,0);
 for(int i=0;i<N;i++)cin>>v[i];

    
  //求m,n
   int m=0,n=0;
  for(int i=1;i<=sqrt(N);i++)  //枚举m
  {
      if(N%i==0)m=i,n=N/i;
      if(m<=n)swap(m,n);
  }
 // cout<<m<<" "<<n<<endl;
    sort(v.begin(),v.end(),cmp);
    
    memset(a,0x3f,sizeof a);  //做标记


  //开始bfs
    int x=0,y=0,d=0;
    int index=0;
    while(N--)
    {
        a[x][y]=v[index++];
        int tempx=x+dx[d],tempy=y+dy[d];
        if(tempx<0||tempx>=m||tempy<0||tempy>=n||a[tempx][tempy]!=0x3f3f3f3f)d=(d+1)%4;
        x=x+dx[d],y=y+dy[d];
    }


    //输出
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<a[i][j];
            if(j+1!=n)cout<<" ";
        }
        cout<<endl;
    }
return 0;
}

image.png

原因是可能m,n有一个可能是素数,那么就可能是1*某一个数,那么一个数是1,另一个数就是N,N最大是1e4,所以要开1e4

image.png

image.png