九宫格问题

来源:互联网 发布:mac装windows虚拟机 编辑:程序博客网 时间:2024/05/19 13:24

        九宫格最早叫“洛书”,现在也叫“幻方”。要求纵向、横向、斜向上的三个数字之和等于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;}

运行结果:

        

0 0
原创粉丝点击