swift2 Swift螺旋矩阵

g9icjywg  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(252)

问题
给定一个整数n,生成一个由元素1到n^2按螺旋顺序填充的方阵。
例如,给定n = 3,
应返回以下矩阵:[ [ 1、2、3 ]、[ 8、9、4 ]、[ 7、6、5 ] ]

class Solution
{
    func generateMatrix(n: Int) -> [[Int]]
    {
        var matrix =
            [[Int]](count: n, repeatedValue: [Int](count: n, repeatedValue: 0))

        var left = 0
        var top = 0
        var right = n - 1
        var down = n - 1
        var count = 1

        while left <= right && top < down // shouble left <= right && top <= down

        {

            for j in (left...right)
            {

                matrix[top][j] = count
                count += 1
            }

            top += 1

            for i in (top...down)
            {

                matrix[i][right] = count
                count += 1
            }

            right -= 1

            for j in (left...right).reverse()
            {

                matrix[down][j] = count
                count += 1
            }
            down -= 1

            for i in (top...down).reverse()
            {

                matrix[i][left] = count
                count += 1
            }
            left += 1

        }

        return matrix
    }
}

var test = Solution()
var result = test.generateMatrix(3)
print(result)

这是我的结果,[ [ 1,2,3 ],[ 8,0,4 ],[ 7,6,5 ] ],缺少了9。我想我应该把while循环改为“left〈= right && top〈= down”,但是我得到了一个错误。
这个错误让我很困惑。因为在条件“左〈=右&&顶部〈=下”下,变量顶部没有机会越过变量下,但是,这个错误提醒我范围结束〈开始。
非常感谢你的帮助!真的很感谢你的时间。

z31licg0

z31licg01#

看起来像是家庭作业,但我会咬一口。假设i, j是从0, 0开始的行和列索引,螺旋运动可以描述如下:
1.增加j,直到达到右侧的矩阵边界
1.增加i,直到达到底部的矩阵边界
1.减小j,直到到达左侧的矩阵边界
1.减小i,直到达到顶部的矩阵边界
1.重复步骤1 - 4,将“非空单元格”替换为“矩阵边界”
下面是代码:

let n = 3

// Init an all-zero matrix
var matrix = Array(0..<n).map { _ in [Int](count: n, repeatedValue: 0) }

var i = 0
var j = 0

// These 2 variables control how we move the i and j cursors
// Initial move is from left to right
var deltaI = 0
var deltaJ = 1

for number in 1...(n*n) {
    matrix[i][j] = number

    let nextI = i + deltaI
    let nextJ = j + deltaJ

    // nextCellIsEmpty == true if:
    //      * nextI is within boundary of the matrix; and
    //      * nextJ is within boundary of the matrix; and
    //      * matrix[nextI][nextJ] is not taken
    let nextCellIsEmpty = (0..<n ~= nextI) && (0..<n ~= nextJ) && (matrix[nextI][nextJ] == 0)

    // If the next cell is not empty, we need to adjust how
    // the cursors move
    if !nextCellIsEmpty {
        if deltaJ == 1 { deltaI = 1; deltaJ = 0; }
        else if deltaI == 1 { deltaI = 0; deltaJ = -1; }
        else if deltaJ == -1 { deltaI = -1; deltaJ = 0; }
        else if deltaI == -1 { deltaI = 0; deltaJ = 1; }
    }

    i += deltaI
    j += deltaJ
}

matrix.forEach { print($0) }

~=是“模式匹配”运算符。如果a <= c < b,则a..<b ~= c返回真

gcmastyq

gcmastyq2#

在末尾添加以下代码:
矩阵[(下+上)/ 2][(左+右)/ 2] = n * n
由于你的算法,中间的矩阵不能满足你的限制,
因此只需添加以下代码。
此外,n应该是奇数(1,3,5...),可以满足您的算法,这是应该考虑的。

相关问题