PAT (Basic Level) Practice (中文)1050 螺旋矩阵 (25 分)

1050 螺旋矩阵 (25 分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10^​4,相邻数字以空格分隔。

输出格式:

输出输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

这道题有一点点绕

步骤

1.首先你要确认矩阵的行和列,用two pointers的思想不断逼近答案。
2.其次排序数组
3.然后按照螺旋矩阵的规则,填入到二维矩阵中
4.最后输出

需要注意的地方

1.要记得初始化二维数组,不然会因为判断失误而提前拐弯
2.while的判断注意是(index

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
void fun(int &a,int &b,int n)
{
    a=1,b=1; 
    int i,j;
    i=1,j=n;
//  if(n%2!=0)
//  {
//      i=1;
//      j=n;
//  }
//  else
//  {
//      i=2;
//      j=n/2;
//  }
    while(i<=j)
    {
        if(i*j==n)
        {
            a=i++,b=j;
        }
        if(i*j<n)
        {
            i++;
        }
        if(i*j>n)
        {
            j--;
        }
    }
}

int main()
{
    int num[10010]={0};
    int N;
    scanf("%d",&N);
    getchar();
    for(int i=0;i<N;i++)
    {
        scanf("%d",&num[i]);

    }
    sort(num,num+N,cmp);
//  for(int i=0;i<N;i++)
//  {
//      printf("%d ",num[i]);
//  }
    int m=0,n=0;
    fun(m,n,N);
    //printf("%d %d",m,n);
    //m为行,n为列 
    if(m<n)
    {
        int temp=m;
        m=n;
        n=temp;
    }   

    int index=0;
    int i=0,j=0;
    int di=0,dj=1;
    int ans[m][n];
    //一定要初始化!!否则会因为判断下一个数字已经填过了而进行拐弯! 
    memset(ans,0,sizeof(ans));
    //N=9
    //index=8
//  int temp=0;
    while(index<N)
    {
        ans[i][j]=num[index];
//      temp=num[index];
//      ans[i][j]=index;

        //第一种情况 往右走,当下一个数不为零或者达到了最大值,往下走 
        if(dj==1&&(ans[i][j+1]!=0||j==n-1))
        {
            di=1;
            dj=0;
        }
        else if(di==1&&(ans[i+1][j]!=0||i==m-1))
        {
            di=0;
            dj=-1;
        }
        else if(dj==-1&&(ans[i][j-1]!=0||j==0))
        {
            di=-1;
            dj=0;   
        }
        else if(di==-1&&(ans[i-1][j]!=0||i==0))
        {
            di=0;
            dj=1;
        }
        i+=di;
        j+=dj;
        index++;
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(j!=0) printf(" ");
            printf("%d",ans[i][j]);
        }
        printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/82668334
今日推荐