138 lines
4.7 KiB
Java
138 lines
4.7 KiB
Java
|
|
public class Grid {
|
|
private Cell[] cells = new Cell[81];
|
|
private Cell[][] rows = new Cell[9][9];
|
|
private Cell[][] squares = new Cell[9][9];
|
|
|
|
public Grid() {
|
|
initializeCells();
|
|
}
|
|
|
|
public Grid(String repr) {
|
|
initializeCells();
|
|
parseRepr(repr);
|
|
}
|
|
|
|
private void initializeCells() {
|
|
for (int i = 0; i < 81; i++) {
|
|
this.cells[i] = new Cell(i);
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
for (int j = 0; j < 9; j++) {
|
|
Cell cell = this.cells[9*i +j];
|
|
|
|
this.rows[i][j] = cell;
|
|
this.squares[3*(i/3) +(j/3)][3*(i%3) +(j%3)] = cell;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
for (int j = 0; j < 9; j++) {
|
|
Cell cell = this.cells[9*i +j];
|
|
int curr_square = 3*(i%3) + (j%3);
|
|
|
|
Cell[] row = new Cell[8];
|
|
Cell[] col = new Cell[8];
|
|
Cell[] square = new Cell[8];
|
|
|
|
int offset_row = 0;
|
|
int offset_col = 0;
|
|
int offset_square = 0;
|
|
for (int k = 0; k < 8; k++) {
|
|
if (k == j) {
|
|
offset_row = 1;
|
|
}
|
|
if (k == i) {
|
|
offset_col = 1;
|
|
}
|
|
if (k == curr_square) {
|
|
offset_square = 1;
|
|
}
|
|
|
|
row[k] = this.rows[i][k+offset_row];
|
|
col[k] = this.rows[k+offset_col][j];
|
|
square[k] = this.squares[3*(i/3) +(j/3)][k+offset_square];
|
|
}
|
|
|
|
cell.finishInit(row, col, square);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
public void setCell(int n, int v) {
|
|
this.cells[n].set(v);
|
|
}
|
|
|
|
private void parseRepr(String repr) {
|
|
String[] rows = repr.split("\\.");
|
|
assert rows.length == 9;
|
|
for (int i = 0; i < rows.length; i++) {
|
|
String line = rows[i];
|
|
assert line.length() == 9;
|
|
|
|
for (int j = 0; j < 9; j++) {
|
|
char c = line.charAt(j);
|
|
if (c != ' ') {
|
|
int val = c - '0';
|
|
this.cells[9*i +j].set(val);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
Character[][] values = new Character[27][27];
|
|
for (int i = 0; i < 27; i++) {
|
|
for (int j = 0; j < 27; j++) {
|
|
int value = 3*(i%3) +(j%3) +1;
|
|
values[i][j] = this.rows[i/3][j/3].probe(value)
|
|
? (char)('0'+value)
|
|
: ' ';
|
|
}
|
|
}
|
|
String formatString = "%c%c%c %c%c%c %c%c%c | %c%c%c %c%c%c %c%c%c | %c%c%c %c%c%c %c%c%c\n";
|
|
String delim1 = " | |\n";
|
|
String delim2 = "---------------------------------------\n";
|
|
return
|
|
String.format(formatString, (Object [])values[0])+
|
|
String.format(formatString, (Object [])values[1])+
|
|
String.format(formatString, (Object [])values[2])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[3])+
|
|
String.format(formatString, (Object [])values[4])+
|
|
String.format(formatString, (Object [])values[5])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[6])+
|
|
String.format(formatString, (Object [])values[7])+
|
|
String.format(formatString, (Object [])values[8])+
|
|
delim2+
|
|
String.format(formatString, (Object [])values[9])+
|
|
String.format(formatString, (Object [])values[10])+
|
|
String.format(formatString, (Object [])values[11])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[12])+
|
|
String.format(formatString, (Object [])values[13])+
|
|
String.format(formatString, (Object [])values[14])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[15])+
|
|
String.format(formatString, (Object [])values[16])+
|
|
String.format(formatString, (Object [])values[17])+
|
|
delim2+
|
|
String.format(formatString, (Object [])values[18])+
|
|
String.format(formatString, (Object [])values[19])+
|
|
String.format(formatString, (Object [])values[20])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[21])+
|
|
String.format(formatString, (Object [])values[22])+
|
|
String.format(formatString, (Object [])values[23])+
|
|
delim1+
|
|
String.format(formatString, (Object [])values[24])+
|
|
String.format(formatString, (Object [])values[25])+
|
|
String.format(formatString, (Object [])values[26]);
|
|
}
|
|
}
|
|
|