package cap3 // Ex22 魔方阵,罗伯法 func Ex22(n int) [][]int { matrix := _makeMatrix(n) if n%2 == 0 { return matrix } // 起始位置在第一行的中间 i, j := 0, n/2 for num := 1; num <= n*n; num++ { matrix[i][j] = num // 填充数字 num++ // 下一个数字 i-- // 向上移动 j++ // 向右移动 // 如果移动后超出了上边界和右边界 if i < 0 && j > n-1 { i += 2 // 向下移动两格 j-- // 向左移动一格 } // 如果超出了上边界 if i < 0 { i = n - 1 // 移动到最下面一行 } // 如果超出了右边界 if j > n-1 { j = 0 // 移动到最左边一列 } // 如果当前位置已经填充了数字 if matrix[i][j] != 0 { i += 2 // 向下移动两格 j-- // 向左移动一格 } } return matrix }