九宫格最早叫“洛书”,现在也叫“幻方”。要求纵向、横向、斜向上的三个数字之和等于15,而且1-9这9个数字不能重复。现在我们创建一个n(n为奇数)维矩阵,要求矩阵中数字为0-n2之间的数,且纵向、横向、斜向上三个数字之和相等。
解九宫格的方法有很多,这里使用Merzirac法:
一居上行正中央,依次斜填切莫忘;上出框界往下写,右出框时左边放;重复便在下格填,出角重复一个样。即:
(1) 在第一行居中的方格内放1,依次右上方填入2,3,4…;
(2) 如果这个数所要放的格已经超出了顶行,那么就把它放在此格的底行;
(3) 如果这个数所要放的格已经超出了最右列,那么就把它放在此格的最左列;
(4) 如果这个数所要放的格已经有了数字,那么就把它放在上一个数所在格的下一格;
(5) 如果右上方有数字出了对角线,则和重复(即第4步)一样处理。
核心代码如下:
int[][] sudoku(int n) { // n为维数 int [][] a= new int[n][n]; int row=0, col=n/2; for (int i=1; i<=n*n; ++i) { a[row][col] = i; --row; // 设定行数从上往下递增,列数从左往右递增 依次斜填 ++col; if (row<0 && col==n) { // 出角的情况 ++row; // 先返回上一格 --col; ++row; // 再下移一格 } else if (col == n) { // 右出框时左边放 col = 0; } else if (row < 0) { // 上出框界往下写 row = n-1; } else if (a[row][col] > 0) { // 重复的情况,处理方式和出角相同 ++row; --col; ++row; } } return a;}运行结果:
新闻热点
疑难解答