富有敗筆的B1050 螺旋矩陣 (25分)

interessant發表於2020-12-19

富有敗筆的B1050 螺旋矩陣 (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

思路:這次比較笨拙了,程式碼比較複雜,首先需要設計好螺旋矩陣的矩陣大小mn,設計出矩陣後再從一個矩陣的座標開始,題目中根據從小到大的方式放入一個二維的陣列當中去。根據走迷宮的方式找到每一個沒有數字的空位填入進去,簡而言之些就是碰到南牆就轉頭。
目標:首先要把輸入的數字們排個序,其次需要把轉彎的演算法實現。
程式碼如下:

#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
bool cmp(int a, int b)
{
    return a>b;
}

int main()
{   char name= 'R';
    int N;
    scanf("%d",&N);
    int m=N,n=1,m1,n1;
    int min=1000000000;
    while(m>=n)//定義m與n的值
    {
       if(N%m==0)
        {
            n=N/m;
            if(m>=n&&min>m-n)
            {
                min =m-n;
                m1=m;
                n1=n;
            }
        }
        m--;
    }
    m = 0;
    n = 0;
    int m2 = m1 ;
    int n2=n1;
    int a[N] ;
   for(int i = 0 ; i<N ;i++)
   {
       scanf("%d",&a[i]);
   }
   sort(a,a+N,cmp);
    int s[n1][m1];
    int step =0,count = 0;
    for(step;step<N;step++)//撞了南牆的實現方法
    {
        if(name =='R')
            {
                s[n][m]=a[step];
                n++;
                if(n==n1)
                {   m++;
                    n--;
                    n1=n;
                    name ='D';
                }
            }
        else if(name =='D')
        {
            s[n][m]=a[step];
            m++;
            if(m==m1)
            {
                m--;
                m1=m;
                name ='L';
            }

        }
         else if(name =='L')
            {
                 n--;
                 s[n][m]=a[step];
                 if(n==count)
                 {
                    count++;
                     name ='U';
                 }
            }
        else
            {
                m--;
                s[n][m]=a[step];
                if(m==count)
                {
                    n++;
                    name='R';
                }
            }
    }


 for(int i = 0; i<m2;i++)
    {

     for(int j = 0;j<n2;j++)
    {
        printf("%d",s[j][i]);
        if(j!=n2-1)
        printf(" ");
    }
    printf("\n");
    }
    return 0;
}


2021的考研小夥伴們加油!
距2022考研還有360幾天

相關文章