1050 螺旋矩阵

螺旋矩阵

题目描述:

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

输入格式:

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

输出格式:

输出螺旋矩阵。每行 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

思路:

最后一直有个最后的测试点是非零返回,最后查资料大神说最后一个测试点的数据是9773,真狠,最后结果是9773行1列,非零返回是因为flag数组开小了。

level是外层循环,计算公式是m/2+m%2,再加上四层内层循环,数字一定要是右-下-左-上的顺序。

学习了新东西:

sort.Sort(sort.Reverse(sort.IntSlice(num)))

将一个数字切片逆序排序

代码:

package main

import (
    "fmt"
    "math"
    "sort"
)

func main() {
    var nu, a,m,n,count,level int
    var num []int
    var flag [10000][200]int
    fmt.Scanf("%d",&nu)
    for i := 0; i < nu; i++ {
        fmt.Scanf("%d",&a)
        num = append(num, a)
    }

    sort.Sort(sort.Reverse(sort.IntSlice(num)))
    //求m和n,确定长和宽,m是几行,n是几列
    for i := int(math.Sqrt(float64(nu))); i >=1; i-- {
            if nu % i == 0 {
                n = i
                m = nu / i
                break
            }
        }
        //fmt.Println(m,n)
   level = m/2 +m % 2
   for i:=0;i<level;i++{
       //第一行
       for j:=i;j<n-i&&count<nu;j++{
           flag[i][j] = num[count]
           count++
       }
       //最后一列
       for j:=i+1;j<m-i-1&&count<nu;j++{
           flag[j][n-1-i] = num[count]
           count++
       }
       //最后一行
       for j:=n-i-1;j>=i&&count<nu;j--{
           flag[m-i-1][j] = num[count]
           count++
       }
       //第一列
       for j:=m-i-2;j>i&&count<nu;j--{
           flag[j][i] = num[count]
           count++
       }
   }
   for i:=0;i<m;i++{
       for j:=0;j<n;j++{
           fmt.Printf("%d",flag[i][j])
           if j!=n-1{
               fmt.Printf(" ")
           }else {
               fmt.Printf("\n")
           }
       }
   }
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!