您的位置:首页 > 编程语言 > Java开发

第五届蓝桥杯JavaA组第六题

2017-02-16 20:59 316 查看
你一定听说过“数独”游戏。

如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。

输出9行,每行9个数字表示数独的解。

例如:

输入(即图中题目):

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

public class BB0506 {

private int[][] matrix;

public BB0506(int[][] matrix) {
this.matrix = matrix;
}

public static void main(String[] args) {
// 号称世界上最难数独
int[][] sudoku = {
{8, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 3, 6, 0, 0, 0, 0, 0},
{0, 7, 0, 0, 9, 0, 2, 0, 0},
{0, 5, 0, 0, 0, 7, 0, 0, 0},
{0, 0, 0, 0, 4, 5, 7, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 3, 0},
{0, 0, 1, 0, 0, 0, 0, 6, 8},
{0, 0, 8, 5, 0, 0, 0, 1, 0},
{0, 9, 0, 0, 0, 0, 4, 0, 0}};
BB0506 s = new BB0506(sudoku);
s.backTrace(0, 0);
}

/**
* 数独算法
*
* @param i 行号
* @param j 列号
*/
private void backTrace(int i, int j) {
if (i == 8 && j == 9) {
//已经成功了,打印数组即可
System.out.println("获取正确解");
printArray();
return;
}

//已经到了列末尾了,还没到行尾,就换行
if (j == 9) {
i++;
j = 0;
}

//如果i行j列是空格,那么才进入给空格填值的逻辑
if (matrix[i][j] == 0) {
for (int k = 1; k <= 9; k++) {
//判断给i行j列放1-9中的任意一个数是否能满足规则

a2dd
if (check(i, j, k)) {
//将该值赋给该空格,然后进入下一个空格
matrix[i][j] = k;
backTrace(i, j + 1);
//初始化该空格
matrix[i][j] = 0;
}
}
} else {
//如果该位置已经有值了,就进入下一个空格进行计算
backTrace(i, j + 1);
}
}

/**
* 判断给某行某列赋值是否符合规则
*
* @param row    被赋值的行号
* @param line   被赋值的列号
* @param number 赋的值
* @return
*/
private boolean check(int row, int line, int number) {
//判断该行该列是否有重复数字
for (int i = 0; i < 9; i++) {
if (matrix[row][i] == number || matrix[i][line] == number) {
return false;
}
}
//判断小九宫格是否有重复
int tempRow = row / 3;
int tempLine = line / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (matrix[tempRow * 3 + i][tempLine * 3 + j] == number) {
return false;
}
}
}

return true;
}

/**
* 打印矩阵
*/
public void printArray() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println();
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: