首页 > 学院 > 开发设计 > 正文

九宫格问题

2019-11-06 07:57:02
字体:
来源:转载
供稿:网友

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

运行结果:

        


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表