Just another update
This commit is contained in:
parent
a25938f123
commit
00a190b0a6
6591 changed files with 94363 additions and 23227 deletions
105
Task/Solve-a-Hidato-puzzle/Java/solve-a-hidato-puzzle.java
Normal file
105
Task/Solve-a-Hidato-puzzle/Java/solve-a-hidato-puzzle.java
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class Hidato {
|
||||
|
||||
private static int[][] board;
|
||||
private static int[] given, start;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String[] input = {"_ 33 35 _ _ . . .",
|
||||
"_ _ 24 22 _ . . .",
|
||||
"_ _ _ 21 _ _ . .",
|
||||
"_ 26 _ 13 40 11 . .",
|
||||
"27 _ _ _ 9 _ 1 .",
|
||||
". . _ _ 18 _ _ .",
|
||||
". . . . _ 7 _ _",
|
||||
". . . . . . 5 _"};
|
||||
|
||||
setup(input);
|
||||
printBoard();
|
||||
System.out.println("\nFound:");
|
||||
solve(start[0], start[1], 1, 0);
|
||||
printBoard();
|
||||
}
|
||||
|
||||
private static void setup(String[] input) {
|
||||
/* This task is not about input validation, so
|
||||
we're going to trust the input to be valid */
|
||||
|
||||
String[][] puzzle = new String[input.length][];
|
||||
for (int i = 0; i < input.length; i++)
|
||||
puzzle[i] = input[i].split(" ");
|
||||
|
||||
int nCols = puzzle[0].length;
|
||||
int nRows = puzzle.length;
|
||||
|
||||
List<Integer> list = new ArrayList<>(nRows * nCols);
|
||||
|
||||
board = new int[nRows + 2][nCols + 2];
|
||||
for (int[] row : board)
|
||||
for (int c = 0; c < nCols + 2; c++)
|
||||
row[c] = -1;
|
||||
|
||||
for (int r = 0; r < nRows; r++) {
|
||||
String[] row = puzzle[r];
|
||||
for (int c = 0; c < nCols; c++) {
|
||||
String cell = row[c];
|
||||
switch (cell) {
|
||||
case "_":
|
||||
board[r + 1][c + 1] = 0;
|
||||
break;
|
||||
case ".":
|
||||
break;
|
||||
default:
|
||||
int val = Integer.parseInt(cell);
|
||||
board[r + 1][c + 1] = val;
|
||||
list.add(val);
|
||||
if (val == 1)
|
||||
start = new int[]{r + 1, c + 1};
|
||||
}
|
||||
}
|
||||
}
|
||||
Collections.sort(list);
|
||||
given = new int[list.size()];
|
||||
for (int i = 0; i < given.length; i++)
|
||||
given[i] = list.get(i);
|
||||
}
|
||||
|
||||
private static boolean solve(int r, int c, int n, int next) {
|
||||
if (n > given[given.length - 1])
|
||||
return true;
|
||||
|
||||
if (board[r][c] != 0 && board[r][c] != n)
|
||||
return false;
|
||||
|
||||
if (board[r][c] == 0 && given[next] == n)
|
||||
return false;
|
||||
|
||||
int back = board[r][c];
|
||||
if (back == n)
|
||||
next++;
|
||||
|
||||
board[r][c] = n;
|
||||
for (int i = -1; i < 2; i++)
|
||||
for (int j = -1; j < 2; j++)
|
||||
if (solve(r + i, c + j, n + 1, next))
|
||||
return true;
|
||||
|
||||
board[r][c] = back;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void printBoard() {
|
||||
for (int[] row : board) {
|
||||
for (int c : row) {
|
||||
if (c == -1)
|
||||
System.out.print(" . ");
|
||||
else
|
||||
System.out.printf(c > 0 ? "%2d " : "__ ", c);
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue