我正在使用的3x3魔方充满了数字1-9。每行,每列和对角线中的值必须加到15.我必须遵循以下伪代码:
recursive_funtion(position) {
for number from 1 to 9, not used elsewhere already {
put this number on this position, make it unavailable
if solution valid {
if solution complete {
done, show solution
}else{
recursive_function(next_position)
}
}
(make this space blank again, and the number available)
}
}
我让它一直工作直到它通过第一行,并意识到在左上角加上1并且在顶部中间点加2后,就无法在该行中制作15。有人能够看到我犯错的地方或填写我错过的任何逻辑吗?感谢。
public class MagicSquare {
private int[][] magicSquare;
private boolean[] available;
public MagicSquare() {
magicSquare = new int[3][3];
available = new boolean[9];
for (int i = 0; i < available.length; i++) {
available[i] = true;
}
}
public void run() {
System.out.println("Magic Square Puzzle");
solve(0, 0);
}
public boolean solve(int row, int col) {
for (int i = 1; i <= 9; i++) {
if (isAvailable(i)) {
System.out.println("placing " + i + " at (" + row + ", " + col + ")");
magicSquare[row][col] = i;
available[i - 1] = false;
//solution is valid so far
if (isFilledRow(row)) {
if (isValidRow(row) && isValidCol(col)) {
if (solve(row, col)) {
return true;
} else {
magicSquare[row][col] = 0;
magicSquare[row][col - 1] = 0;
col = col - 1;
available[magicSquare[row][col] - 1] = false;
solve(row, col);
}
}
}
if (!isFilledRow(row)) { //check logic here!
if (isValidSolution()) {
System.out.println("You found a correct solution!");
printSolution();
} else {
//new row
if (col == 2 && row != 2) {
row = row + 1;
System.out.println("new row and solve(" + row + ", " + col + ")");
solve(row, 0);
//new col
} else if (col != 2) {
col = col + 1;
System.out.println("new col and solve(" + row + ", " + col + ")");
solve(row, col);
} else if (row == 2 && col == 2) {
//check logic here!
}
}
}
magicSquare[row][col] = 0;
available[i - 1] = true;
}
}
return false;
}
public boolean isAvailable(int value) {
if (available[value - 1] == true) {
System.out.println(value + " is available to be placed");
return true;
} else {
System.out.println(value + " is not available to be placed");
return false;
}
}
public boolean isFilledRow(int row) {
if (magicSquare[row][0] != 0 && magicSquare[row][1] != 0 && magicSquare[row][2] != 0) {
System.out.println("row " + row + " is filled");
return true;
} else {
//System.out.println("row " + row + " is not filled");
return false;
}
}
public boolean isValidRow(int row) {
if (magicSquare[row][0] + magicSquare[row][1] + magicSquare[row][2] == 15) {
System.out.println("row " + row + " adds to 15");
return true;
} else {
System.out.println("row " + row + " does not add to 15");
return false;
}
}
public boolean isValidCol(int col) {
if (magicSquare[0][col] + magicSquare[1][col] + magicSquare[2][col] == 15) {
System.out.println("col " + col + " adds to 15");
return true;
} else {
//System.out.println("col " + col + " does not add to 15");
return false;
}
}
public boolean isValidOnDiagonals() {
if ((magicSquare[0][0] + magicSquare[1][1] + magicSquare[2][2] == 15) && (magicSquare[2][0] + magicSquare[1][1] + magicSquare[0][2] == 15)) {
System.out.println("diagonals add to 15");
return true;
} else {
//System.out.println("diagonals don't add to 15");
return false;
}
}
public boolean isValidSolution() {
for (int i = 0; i < magicSquare.length; i++) {
if (isValidRow(i) && isValidCol(i) && isValidOnDiagonals()) {
System.out.println("solution is valid");
return true;
}
}
//System.out.println("solution is not valid");
return false;
}
public void printSolution() {
for (int i = 0; i < magicSquare.length; i++) {
for (int j = 0; j < magicSquare[i].length; j++) {
System.out.print(magicSquare[i][j] + " ");
}
System.out.println();
}
}
}
答案 0 :(得分:1)
一些问题:
isValidSolution()
也可以返回true
。solve()
方法的逻辑有点过于复杂。我试着简化它。System.out.println
语句实际上会对算法的执行时间产生巨大影响。所以我评论了大部分内容。我相信你可以继续改进这一点,目前,它在找到第一个解决方案后并没有停止。它实际上打印出所有解决方案。
希望您可以使用它来让您更接近最终/抛光算法:
public class MagicSquare {
private int[][] magicSquare;
private boolean[] available;
public MagicSquare() {
magicSquare = new int[3][3];
available = new boolean[9];
for (int i = 0; i < available.length; i++) {
available[i] = true;
}
}
public void run() {
System.out.println("Magic Square Puzzle");
solve(0, 0);
}
public void solve(int row, int col) {
for (int i = 1; i <= 9; i++) {
if (isAvailable(i)) {
//System.out.println("placing " + i + " at (" + row + ", " + col + ")");
magicSquare[row][col] = i;
available[i - 1] = false;
//solution is valid so far
if (isFilled()) {
if (isValidSolution()) {
System.out.println("You found a correct solution!");
printSolution();
}
} else {
if (col != 2) {
//System.out.println("new col and solve(" + row + ", " + col + ")");
solve(row, col + 1);
} else if (row != 2) {
//System.out.println("new row and solve(" + row + ", " + col + ")");
solve(row + 1, 0);
//new col
}
}
magicSquare[row][col] = 0;
available[i - 1] = true;
}
}
}
public boolean isAvailable(int value) {
if (available[value - 1] == true) {
//System.out.println(value + " is available to be placed");
return true;
} else {
//System.out.println(value + " is not available to be placed");
return false;
}
}
public boolean isValidRow(int row) {
if (magicSquare[row][0] + magicSquare[row][1] + magicSquare[row][2] == 15) {
//System.out.println("row " + row + " adds to 15");
return true;
} else {
//System.out.println("row " + row + " does not add to 15");
return false;
}
}
public boolean isValidCol(int col) {
if (magicSquare[0][col] + magicSquare[1][col] + magicSquare[2][col] == 15) {
//System.out.println("col " + col + " adds to 15");
return true;
} else {
//System.out.println("col " + col + " does not add to 15");
return false;
}
}
public boolean isValidOnDiagonals() {
if ((magicSquare[0][0] + magicSquare[1][1] + magicSquare[2][2] == 15) && (magicSquare[2][0] + magicSquare[1][1] + magicSquare[0][2] == 15)) {
//System.out.println("diagonals add to 15");
return true;
} else {
//System.out.println("diagonals don't add to 15");
return false;
}
}
public boolean isValidSolution() {
for (int i = 0; i < magicSquare.length; i++) {
if (!isValidRow(i) || !isValidCol(i)) {
//System.out.println("solution is valid");
return false;
}
}
//System.out.println("solution is not valid");
return isValidOnDiagonals();
}
public boolean isFilled() {
for (int i = 0; i < available.length; i++) {
if (available[i]) {
return false;
}
}
return true;
}
public void printSolution() {
for (int i = 0; i < magicSquare.length; i++) {
for (int j = 0; j < magicSquare[i].length; j++) {
System.out.print(magicSquare[i][j] + " ");
}
System.out.println();
}
}
}