package gdp.aufgabe22; public class Sudoku{ // 'A B C D E F G H I' sind mögliche Elemente // neben '\0' public static boolean isPermutation(char[] a){ boolean[] set = new boolean[9]; for(int i = 0; i < a.length; i++) if(('A' <= a[i]) && (a[i] <= 'I')) if(!set[a[i] - 65]) set[a[i] - 65] = true; else return false; return true; } public static boolean isPermutationRow(char[][] a, int row){ return isPermutation(a[row]); } public static boolean isPermutationCol(char[][] a, int col){ char[] column = new char[a[0].length]; for(int i = 0; i < a[0].length; i++) column[i] = a[i][col]; return isPermutation(column); } public static boolean isPermutationMatrix(char[][] a){ for(int i = 0; i < a.length; i++) for(int j = 0; j < a[0].length; j++) if(!(isPermutationRow(a, i) && isPermutationCol(a, j))) return false; // Alle Spalten und Reihen durchlaufen. // Alle Kriterien stimmen. return true; } public static boolean isPermutationBlock(char[][] a, int minRow, int maxRow, int minCol, int maxCol){ // Nicht "nur" eine Matrx. // Impliziert: Wenn ein PermBlock dann auch eine Matrix. if(!isPermutationMatrix(a)) return false; char[] block = new char[(maxRow - minRow) * (maxCol - minCol)]; for(int i = minRow; i < maxRow; i++) for(int j = minCol; j < maxCol; j++) block[(i - minRow) * (j - minCol)] = a[i][j]; System.out.println("Size of block: " + (minRow - maxRow) * (maxCol - minCol)); return isPermutation(block); } private static boolean rowColChecker(char[][] a){ for(int i = 0; i < a.length; i++) if(!isPermutationRow(a, i)) return false; for(int i = 0; i < a[0].length; i++) if(!isPermutationCol(a, i)) return false; return true; } private static boolean blockChecker(char[][] a){ boolean set[] = new boolean[9]; for(int i = 0; i < a.length; i++) for(int j = 0; j < a[0].length; j++) if(('A' <= a[i][j]) && (a[i][j] <= 'I')) if(!set[a[i][j] - 65]) set[a[i][j] - 65] = true; else return false; return true; } public static boolean isValid(char[][] a){ // The results from the unit test // suggest, that zeros in the matrix // are considered to be valid. // // for(int i = 0; i < a.length; i++) // for(int j = 0; j < a[0].length; j++) // if(a[i][j] == 0) // return false; // // Eine gelöstes Soduke ist eine Permutationsmatrix... if(!isPermutationMatrix(a)) return false; System.out.println("Passed Permutation Matrix Test!"); if (isPermutationBlock(a, 0, 3, 0, 3) == false) return false; else if (isPermutationBlock(a, 0, 3, 3, 6) == false) return false; System.out.println("Passed 2nd Permutation Block Test!"); if (isPermutationBlock(a, 0, 3, 6, 9) == false) return false; else if (isPermutationBlock(a, 3, 6, 0, 3) == false) return false; System.out.println("Passed 4th permutation block test!"); if (isPermutationBlock(a, 3, 6, 3, 6) == false) return false; else if (isPermutationBlock(a, 3, 6, 6, 9) == false) return false; System.out.println("Passed 6th permutation block test!"); if (isPermutationBlock(a, 6, 9, 0, 3) == false) return false; else if (isPermutationBlock(a, 6, 9, 3, 6) == false) return false; else if (isPermutationBlock(a, 6, 9, 6, 9) == false) return false; System.out.println("Running RowColChecker!"); if(!rowColChecker(a)) return false; System.out.println("Running BlockChecker!"); if(!blockChecker(a)) return false; System.out.println("Passed all permutation tests!"); return true; } public static char[][] solve(char[][] a){ return null; } }