Aufgabenstellung: Schreiben Sie ein Programm welches ein XSudoku mit 9×9 Feldern loest. Die zu verwendeten Methoden und Parameter waren vorgegeben.

package gdp.aufgabe22;

import java.util.Arrays;

import javax.management.RuntimeErrorException;

public class XSudoku {

	public static boolean isPermutation(int[] a) {
		// TODO Ueberprüft unsere Permutationsbedingung fuer das Array a
		int[] numbersToCheck = a;
		for (int j = 0; j < numbersToCheck.length; j++) {
			for (int k = j + 1; k < numbersToCheck.length; k++) {
				if (numbersToCheck[j] == 0) {
					continue;
				}

				if (numbersToCheck[j] == numbersToCheck[k]) {
					return false;
				}
			}
		}
		return true;
	}

	public static boolean isPermutationRow(int[][] a, int row) {
		int[] numbersToCheck = new int[a[0].length];

		// schreibt alle Zahlen in das Array checkNumber
		for (int i = 0; i < a[0].length; i++) {
			// schreibt an stelle i des Arrays checkNumber den Wert des
			// Arrays a
			numbersToCheck[i] = a[row][i];
		}
		// Schaut ob das Array numbersToCheck keine Doppelten Zahlen mit
		// Ausnahme der 0 enthaelt.
		return isPermutation(numbersToCheck);
	}

	// TODO Ueberprueft, ob Reihe row im zweidimensionalen Array a eine
	// Permutationsmenge ist
	public static boolean isPermutationCol(int[][] a, int col) {

		int[] numbersToCheck = new int[a.length];

		// schreibt alle Zahlen in das Array checkNumber
		for (int i = 0; i < a.length; i++) {
			// schreibt an stelle i des Arrays checkNumber den Wert des
			// Arrays a
			numbersToCheck[i] = a[i][col];
		}
		// Schaut ob das Array numbersToCheck keine Doppelten Zahlen mit
		// Ausnahme der 0 enthaelt.
		return isPermutation(numbersToCheck);
	}

	public static boolean isPermutationDiagonalLeftRight(int[][] a) {
		// TODO Ueberprueft, ob die beiden Diagonalen im zweidimensionalen Array
		// a Permutationsmengen sind
		int[] numbersToCheck = new int[a.length];

		// schreibt alle Zahlen fuer die Diagonale links oben nach rechts unten
		// in das Array checkNumber
		for (int i = 0; i < a.length; i++) {
			// schreibt an stelle i des Arrays checkNumber den Wert des
			// Arrays a
			numbersToCheck[i] = a[i][i];
		}
		// Schaut ob das Array numbersToCheck keine Doppelten Zahlen mit
		// Ausnahme der 0 enthaelt.
		return isPermutation(numbersToCheck);
	}

	public static boolean isPermutationDiagonalRightLeft(int[][] a) {
		// TODO Ueberprueft, ob die beiden Diagonalen im zweidimensionalen Array
		// a Permutationsmengen sind
		int[] numbersToCheck = new int[a.length];

		// schreibt alle Zahlen fuer die Diagonale rechts oben nach links unten
		// in das Array checkNumber
		for (int i = 0; i < a.length; i++) {
			// schreibt an stelle i des Arrays checkNumber den Wert des
			// Arrays a
			numbersToCheck[i] = a[i][a.length - 1 - i];
		}
		// Schaut ob das Array numbersToCheck keine Doppelten Zahlen mit
		// Ausnahme der 0 enthaelt.
		return isPermutation(numbersToCheck);
	}

	public static boolean isPermutationDiagonal(int[][] a) {
		// TODO Ueberprueft, ob die beiden Diagonalen im zweidimensionalen Array
		// a Permutationsmengen sind
		return (isPermutationDiagonalLeftRight(a) && isPermutationDiagonalRightLeft(a));
	}

	public static boolean isPermutationBlock(int[][] a, int minRow, int maxRow, int minCol, int maxCol) {
		// TODO Ueberprueft, ob die Menge aller Zahlen im zweidimensionalen
		// Block zwischen den Reihen minRow (inklusive) und maxRow (exklusive)
		// und den Spalten minCol (inklusive) und maxCol (exklusive) eine
		// Permutationsmenge (nicht nur eine Permutationsmatrix) darstellt.
		// if (maxRow - minRow > 3 || maxRow < minRow) {
		// return false;
		// }
		// if (maxCol - minCol > 3 || maxCol < minCol) {
		// return false;
		// }
		//
		int[] numbersToCheck = new int[(maxRow - minRow) * (maxCol - minCol)];
		int col = minCol;
		int row = minRow;
		int i = 0;
		// schreibt alle Zahlen fuer die Diagonale rechts oben nach links unten
		// in das Array checkNumber
		while (row < maxRow) {
			col = minCol;
			while (col < maxCol) {
				try {
					numbersToCheck[i] = a[row][col];
				} catch (Throwable e) {
					throw new RuntimeException("Problem: i=" + i + ", row=" + row + ", col=" + col + ", minrow="
							+ minRow + ", mincol=" + minCol + ", maxrow=" + maxRow + ", maxcol=" + maxCol, e);
				}
				i++;
				col++;
			}
			row++;
		}
		// Schaut ob das Array numbersToCheck keine Doppelten Zahlen mit
		// Ausnahme der 0 enthaelt.
		return isPermutation(numbersToCheck);
	}
	//Checkt ob Zeile und Spalte eine Permutation ist.
	public static boolean isPermutationMatrix(int[][] a) {
		for (int i = 0; i < a.length; i++) {
			if (!isPermutationRow(a, i)) {
				return false;
			}
			if (!isPermutationCol(a, i)) {
				return false;
			}
		}
		return true;
	}
	// Ueberprueft alle Permutationen
	public static boolean checkAllPermutations(int[][] a) {
		if(!isPermutationMatrix(a)){
			return false;
		}
		// int minRow, int maxRow, int minCol, int maxCol
		int kantenlaenge = a.length / 3;
		for (int row = 0; row < a.length; row += kantenlaenge) {
			for (int col = 0; col < a[0].length; col += kantenlaenge) {
				if (!isPermutationBlock(a, row, row + kantenlaenge, col, col + kantenlaenge)) {
					return false;
					// throw new RuntimeException("kantenlaenge: " +
					// kantenlaenge + ", row: " + row + ", col: " + col
					// + ", a.length: " + a.length);
				}
			}
		}

		return isPermutationDiagonal(a);
	}

	public static boolean isValid(int[][] a) {
		if (a.length != 9) {
			return false;
		}
		if (a[0].length != 9) {
			return false;
		}
		return checkAllPermutations(a);
	}

	public static int[][] solve(int[][] a) {
		int[][] sudoku = a;

		if (!isValid(sudoku)) {
			return null;
		}

		for (int row = 0; row < a.length; row++) {
			for (int col = 0; col < a[0].length; col++) {
				if (sudoku[row][col] == 0) {
					for (int k = 1; k <= a.length; k++) {
						sudoku[row][col] = k;
						if (checkAllPermutations(sudoku)) {
							int[][] solvedSudoku = solve(sudoku);
							if (solvedSudoku != null) {
								return sudoku;
							}
						}
					}
					sudoku[row][col] = 0; // nicht sicher
					return null; // nicht sicher
				}
			}
		}
		return sudoku; // nicht sicher
		// throw new RuntimeException("this should never happen");
	}

	// int[][] solvedSudoku = new int[9][9];
	// // int tmp;
	// // int row = 0;
	// // int col = 0;
	//
	// if (!isPermutationMatrix(sudoku)) {
	// solve(sudoku);
	// } else {
	// solvedSudoku = sudoku;
	// return solvedSudoku;
	// }
	// return null;
	// // TODO Berechnet eine Loesung fuer das X-Sudokufeld a. Liefert diese
	// // zurueck, falls sie existiert. Liefert sonst null zurueck.
	// }

	public static void main(String[] args) {
		// testing solver
		int[][] falschesSudoku = new int[][] { { 0, 0, 0, 0, 0, 0, 6, 8, 0 }, { 0, 0, 0, 0, 7, 3, 0, 0, 9 },
				{ 3, 0, 9, 0, 0, 0, 0, 4, 5 }, { 4, 9, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 3, 0, 5, 0, 9, 0, 2 },
				{ 0, 8, 0, 0, 0, 0, 0, 3, 6 }, { 9, 6, 0, 0, 0, 0, 3, 0, 8 }, { 7, 0, 0, 6, 8, 0, 0, 0, 0 },
				{ 0, 2, 8, 0, 0, 0, 0, 0, 0 } };
		System.out.println("----Test falsches Sudoku----");
		int[][] solvedSudoku = solve(falschesSudoku);
		if (solvedSudoku == null) {
			System.out.println("Sudoku kann nicht geloest werden.");
		}
		int[][] sudoku2 = new int[][] { { 0, 0, 6, 1, 3, 0, 0, 0, 7 }, { 0, 0, 0, 0, 0, 0, 1, 0, 0 },
				{ 0, 0, 0, 0, 7, 0, 6, 8, 3 }, { 0, 2, 7, 3, 1, 0, 0, 0, 0 }, { 1, 0, 0, 4, 0, 0, 0, 7, 2 },
				{ 0, 0, 0, 0, 5, 0, 3, 0, 0 }, { 0, 6, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 8, 0, 6, 0, 7, 0, 0 },
				{ 0, 0, 0, 0, 0, 0, 0, 1, 6 } };
		System.out.println("----Test Sudoku2----");
		solvedSudoku = solve(sudoku2);
		if (solvedSudoku == null) {
			System.out.println("Sudoku2 kann nicht geloest werden.");
		} else {
			for (int row = 0; row < 9; row++) {
				for (int col = 0; col < 9; col++) {
					System.out.print(" " + solvedSudoku[row][col]);
				}
				System.out.println("");
			}
		}
		int[][] sudoku3 = new int[][] { { 0, 8, 7, 0, 0, 0, 0, 0, 0 }, { 5, 0, 4, 0, 0, 0, 0, 0, 0 },
				{ 0, 0, 1, 0, 7, 0, 2, 0, 0 },

				{ 0, 0, 9, 0, 0, 0, 1, 3, 0 }, { 2, 0, 0, 0, 0, 1, 0, 9, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 4 },

				{ 0, 0, 0, 0, 1, 9, 0, 0, 0 }, { 0, 0, 2, 7, 0, 0, 0, 6, 0 }, { 8, 9, 0, 0, 0, 3, 0, 0, 0 } };
		System.out.println("----Test Sudoku3----");
		solvedSudoku = solve(sudoku3);
		if (solvedSudoku == null) {
			System.out.println("Sudoku3 kann nicht geloest werden.");
		} else {
			for (int row = 0; row < 9; row++) {
				for (int col = 0; col < 9; col++) {
					System.out.print(" " + solvedSudoku[row][col]);
				}
				System.out.println("");
			}
		}
	}

}

 

Wir nutzen Cookies, um Dir den bestmöglichen Service auf unserer Webseite zu bieten. mehr Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen