src/de/uapcore/sudoku/Solver.java

Sat, 26 Jan 2013 17:42:07 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 26 Jan 2013 17:42:07 +0100
changeset 2
5179eff8a9b6
child 3
ed931970b4ac
permissions
-rw-r--r--

check functions

universe@2 1 package de.uapcore.sudoku;
universe@2 2
universe@2 3 /**
universe@2 4 *
universe@2 5 * @author mike
universe@2 6 */
universe@2 7 public final class Solver {
universe@2 8
universe@2 9 public Solver() {
universe@2 10 }
universe@2 11
universe@2 12 public boolean check(Field f) {
universe@2 13 int line[];
universe@2 14 for (int i = 0 ; i < 9 ; i++) {
universe@2 15 line = getRow(f, i);
universe@2 16 if (!valid(line)) {
universe@2 17 return false;
universe@2 18 }
universe@2 19 line = getColumn(f, i);
universe@2 20 if (!valid(line)) {
universe@2 21 return false;
universe@2 22 }
universe@2 23 }
universe@2 24
universe@2 25 int square[][];
universe@2 26 for (int x = 0 ; x < 3 ; x++) {
universe@2 27 for (int y = 0 ; y < 3 ; y++) {
universe@2 28 square = getSquare(f, x, y);
universe@2 29 if (!valid(square)) {
universe@2 30 return false;
universe@2 31 }
universe@2 32 }
universe@2 33 }
universe@2 34
universe@2 35 return true;
universe@2 36 }
universe@2 37
universe@2 38 private boolean complete(int[][] square) {
universe@2 39 for (int x = 0 ; x < 3 ; x++) {
universe@2 40 for (int y = 0 ; y < 3 ; y++) {
universe@2 41 if (square[x][y] == 0) {
universe@2 42 return false;
universe@2 43 }
universe@2 44 }
universe@2 45 }
universe@2 46 return true;
universe@2 47 }
universe@2 48
universe@2 49 private boolean complete(int[] line) {
universe@2 50 for (int i = 0 ; i < 9 ; i++) {
universe@2 51 if (line[i] == 0) {
universe@2 52 return false;
universe@2 53 }
universe@2 54 }
universe@2 55 return true;
universe@2 56 }
universe@2 57
universe@2 58 private boolean valid(int[] line) {
universe@2 59 int numbers[] = new int[9];
universe@2 60 for (int i = 0 ; i < 9 ; i++) {
universe@2 61 int l = line[i]-1;
universe@2 62 if (l >= 0) {
universe@2 63 if (++numbers[l] > 1) {
universe@2 64 return false;
universe@2 65 }
universe@2 66 }
universe@2 67 }
universe@2 68
universe@2 69 return true;
universe@2 70 }
universe@2 71
universe@2 72 private boolean valid(int[][] square) {
universe@2 73 int[] line = new int[9];
universe@2 74 for (int x = 0 ; x < 3 ; x++) {
universe@2 75 for (int y = 0 ; y < 3 ; y++) {
universe@2 76 line[3*x+y] = square[x][y];
universe@2 77 }
universe@2 78 }
universe@2 79 return valid(line);
universe@2 80 }
universe@2 81
universe@2 82 private int[][] getSquare(Field f, int x, int y) {
universe@2 83 if (x < 0 || x > 2 || y < 0 || y > 2) {
universe@2 84 throw new IllegalArgumentException("Invalid square coordinates");
universe@2 85 }
universe@2 86 int[][] square = new int[3][3];
universe@2 87
universe@2 88 for (int u = 0 ; u < 3 ; u++) {
universe@2 89 for (int v = 0 ; v < 3 ; v++) {
universe@2 90 square[u][v] = f.getCellValue(3*x+u, 3*y+v);
universe@2 91 }
universe@2 92 }
universe@2 93
universe@2 94 return square;
universe@2 95 }
universe@2 96
universe@2 97 private int[] getRow(Field f, int y) {
universe@2 98 if (y < 0 || y > 8) {
universe@2 99 throw new IllegalArgumentException("Invalid row number");
universe@2 100 }
universe@2 101 int row[] = new int[9];
universe@2 102
universe@2 103 for (int x = 0 ; x < 9 ; x++) {
universe@2 104 row[x] = f.getCellValue(x, y);
universe@2 105 }
universe@2 106
universe@2 107 return row;
universe@2 108 }
universe@2 109
universe@2 110 private int[] getColumn(Field f, int x) {
universe@2 111 if (x < 0 || x > 8) {
universe@2 112 throw new IllegalArgumentException("Invalid column number");
universe@2 113 }
universe@2 114 int column[] = new int[9];
universe@2 115
universe@2 116 for (int y = 0 ; y < 9 ; y++) {
universe@2 117 column[y] = f.getCellValue(x, y);
universe@2 118 }
universe@2 119
universe@2 120 return column;
universe@2 121 }
universe@2 122 }

mercurial