오늘 소개하는 자바 소스는 스도쿠 게임 정답을 알아내는 스도쿠 정답 로직 입니다.
소스는 설명할건 없고 쭉~ 보시면 다 아실거라 생각되요
value 값에 스도쿠 게임 문제를 입력해주시면 정답이 출력 됩니다.
문제는 0099700720200 이런식으로 입력해주시면 되고 0자리는 빈칸입니다.
이해가 안되시는 부분은 댓글 남겨주시면 답변드리겠습니다 ^^
public class SudokuSolver extends Exception{ public SudokuSolver(String value ) { int[][] sudoku = new int[9][9]; String line = value; int ii = 0; for (int y = 0; y < 9; y++){ ii += 9; int xx = 0; for (int x = ii - 9; x < ii; x++){ sudoku[y][xx] = Character.getNumericValue(line.charAt(x)); xx++; } }
solve(sudoku, 0, 0); } private void solve(int[][] sudoku, int cellX, int cellY){ if(cellY > 8){ printSudoku(sudoku); }else{ int nextX = cellX; int nextY = cellY; if(cellX == 8){ nextX = 0; nextY++; }else{ nextX++; }
if(sudoku[cellY][cellX] != 0){ solve(sudoku, nextX, nextY); }else{ for(int checkNum = 1; checkNum < 10; checkNum++){ if(checkSquare(sudoku, cellX, cellY, checkNum) && checkRow(sudoku, cellY, checkNum) && checkCol(sudoku, cellX, checkNum)) { sudoku[cellY][cellX] = checkNum; solve(sudoku, nextX, nextY); } } sudoku[cellY][cellX] = 0; } } }
private boolean checkSquare(int[][] sudoku, int reqX, int reqY, int toCheck) { int rowY; int colX;
if(reqX < 3){ colX = 0; }else if (reqX < 6){ colX = 3; }else{ colX = 6; }
if(reqY < 3){ rowY = 0; }else if (reqY < 6){ rowY = 3; }else{ rowY = 6; }
for(int y = rowY; y < rowY + 3; y++){ for(int x = colX; x < colX + 3; x++){ if(sudoku[y][x] == toCheck){ return false; } } }
return true; }
private boolean checkRow(int[][] sudoku, int rowY, int toCheck){ for(int x = 0; x < 9; x++){ if (toCheck == sudoku[rowY][x]){ return false; } } return true; }
private boolean checkCol(int[][] sudoku, int colX, int toCheck){ for(int y = 0; y < 9; y++){ if (toCheck == sudoku[y][colX]){ return false; } } return true; }
private void printSudoku(int sudoku[][]){
for(int y = 0; y < 9; y++){ for(int x = 0; x < 9; x++){ System.out.print(sudoku[y][x]); if(x == 8){ System.out.println(); } } } } }
|