Kendoku

Jacker

Neues Mitglied
Hallo

Ich habe momentan eine Übungsaufgabe zu bearbeiten, die Ich nächste Woche abgeben muss. Ich habe schon ein wenig Erfahrung in Java gesammelt, häng trotzdem bei dieser Aufgabe.
Ich freue mich über Lösungsvorschläge. Im voraus Vielen Dank :toll:

Eine Variante von Sudoku heißt Kendoku. Sie besteht aus einer (n  n)-Matrix, deren Felder durch
dickere Umrandung zu unterschiedlichen Partitionen Pi zusammengefasst werden. Jedem Pi
ist eine
Operation Oi 2 f+; ; ; =; ’ ’g und deren Endergebnis Ri zugeordnet. Das Kendoku ist gelöst,
wenn in jeder Spalte bzw. jeder Zeile jeweils alle Zahlen von 1 bis n genau einmal so vorkommen,
dass sich bei Anwenden von Oi auf alle Zahlen in Pi das angegebene Ri ergibt.
int[][][] kenken
Jede der im Folgenden zu entwickelnden Methoden wird mit
einem dreidimensionalen int-Array aufgerufen, das ein Kendoku-Problem repräsentieren soll. Eine korrekte Datenstruktur hat exemplarisch nebenstehenden Aufbau: Jeder Eintrag
enthält die Daten einer Partition als zweidimensionales intArray. Der erste Eintrag jeder Partition Pi enthält wiederum
ein eindimensionales int-Array der Länge 2 mit dem (Ri
, Oi)-
Paar. Alle weiteren Einträge von Pi sind ebenfalls eindimensionale int-Arrays der Länge 2 und enthalten die Koordinaten
des zu Pi gehörenden Feldes in der Form (Zeile, Spalte). Das
Feld „oben/links“ im Kendoku hat die Koordinaten (0; 0).
Laden Sie die vorgegebene Datei Kendoku.java von der AuD-Seite herunter und implementieren
Sie darin die einzelnen Methoden gemäß ihrer API wie folgt:
a) Ergänzen Sie zunächst die Methode checkIntegrity(). Sie soll überprüfen, ob das übergebene 3D-Array strukturell als Kendoku-Problem (wie oben beschrieben und im Beispiel-Bild
gezeigt) interpretiert werden kann.
b) Implementieren Sie nun die Methode checkValidity(). Sie soll überprüfen, ob das übergebene 3D-Array semantisch als Kendoku-Problem interpretiert werden kann, d.h. ob die Partitionen überlappungsfrei sind und insgesamt genau ein quadratisches Kendoku abdecken (die
Partitionen selbst müssen dabei nicht zwangsweise zusammenhängend sein).
c) Programmieren Sie schließlich ein rekursives Verfahren zur Lösung eines Kendoku-Problems
in solve(). Falls es mindestens eine Lösung gibt, dann soll solve() eine beliebige davon
als quadratisches Array zurückgeben.


Java:
public class Kendoku {
	public static void main(String[] args) {
		int[][][] kenken = {
				{{ 11, '+'}, {0, 0}, {1, 0}},
				{{  2, '/'}, {0, 1}, {0, 2}},
				{{ 20, '*'}, {0, 3}, {1, 3}},
				{{  6, '*'}, {0, 4}, {0, 5}, {1, 5}, {2, 5}},
				{{  3, '-'}, {1, 1}, {1, 2}},
				{{  3, '/'}, {1, 4}, {2, 4}},
				{{240, '*'}, {2, 0}, {2, 1}, {3, 0}, {3, 1}},
				{{  6, '*'}, {2, 2}, {2, 3}},
				{{  6, '*'}, {3, 2}, {4, 2}},
				{{  7, '+'}, {3, 3}, {4, 3}, {4, 4}},
				{{ 30, '*'}, {3, 4}, {3, 5}},
				{{  6, '*'}, {4, 0}, {4, 1}},
				{{  9, '+'}, {4, 5}, {5, 5}},
				{{  8, '+'}, {5, 0}, {5, 1}, {5, 2}},
				{{  2, '/'}, {5, 3}, {5, 4}}
		};
		System.out.println("Integrity check : " + (checkIntegrity(kenken) ? "PASSED" : "FAILED"));
		System.out.println("Validity check  : " + (checkValidity(kenken) ? "PASSED" : "FAILED"));
		int[][] solution = solve(kenken);
		System.out.println("Solution check  : " + (solution != null ? "PASSED" : "FAILED"));
		if (solution != null) {
			printArray(solution);
		}
	}

	public static boolean checkIntegrity(int[][][] kenken) {
		// TODO
		return true;
	}

	public static boolean checkValidity(int[][][] kenken) {
		// TODO
		return true;
	}

	public static int[][] solve(int[][][] kenken) {
		// TODO
		return null;
	}

	protected static void printArray(int[][] array) {
		for (int[] subArray : array) {
			for (int val : subArray)
				System.out.printf("%1$5d", val);
			System.out.println();
		}
	}
}
 
T

Trolllllll

Gast
Willst du deine Hausaufgabe gemacht bekommen, ich glaube da wird sich niemand finden, aber wenn du spezielle Fragen hast, wird dir sicher jemand helfen
 

Jacker

Neues Mitglied
@ Trolllllll

Ich möchte bloß, wenn dann eine Vergleichslösung haben. Ich versuchs natürlich soweit wie möglich selber zu Programmieren.
 
T

Trolllllll

Gast
@ Trolllllll

Ich möchte bloß, wenn dann eine Vergleichslösung haben. Ich versuchs natürlich soweit wie möglich selber zu Programmieren.

Wie schon geschrieben, wenn du irgendwoe ein Problem hast, wird dir geholfen, aber ich glaube keiner hat Lust die aufgabe für dich zu Programmieren ;-)
 

D4rkscr43m

Bekanntes Mitglied
Ich möchte bloß, wenn dann eine Vergleichslösung haben. Ich versuchs natürlich soweit wie möglich selber zu Programmieren.

Dann zeig mal deine Lösung, ich vergleich dann mit meiner :D

Aber ganz erlich, rekursives Lösen von Sudokus ist im Vergleich zu dem hier wirklich sehr einfach und läuft auch deutlich schneller hab ich so im Gefühl...

Habe für beides eine Hau rein und überprüfe Lösung geschrieben (die für Sudokus allerdings damals in C++ und dann mal nach C# portiert). Entweder lief die schneller, weil die Prüfung ob ein ausgefülltes Feld nun deutlich komplizierter ist oder weil java einfach zu langsam ist *duckundweg*
 
J

Jer

Gast
Hallo,

Geh das ganze doch erstmal langsam an, indem du dir überlegst, wie man dieses dreidimensionale Feld überprüfen muss, damit man sagen kann, dass es strukturell richtig ist.

Danach kannst du dich über das Java schreiben Gedanken machen.

(Falls ein anderer einen besseren "auf die Sprünge helfen" hat bitte schreiben ;))
 
S

SuperCode55005

Gast
hab dir die Lösung per Privat-Nachricht geschickt. Kann dein Dozent ja nicht überprüfen ...
 
K

kneitzel

Gast
Der Thread ist 8 Jahre alt und der User ist nicht mehr aktiv ... also dürfte das eher unwahrscheinlich sein, dass er das noch mitbekommt....
 
K

kneitzel

Gast
Wenn Du Fragen hast, dann darfst Du selbstverständlich im Forum einen (oder auch gerne mehrere, falls es verschiedene Themen betrifft) Thread für Deine Fragen eröffnen. Ich bin sicher, dass Du dann auch Antworten in diesem Thread bekommen wirst.
 

Fabian04088

Aktives Mitglied
Wenn Du Fragen hast, dann darfst Du selbstverständlich im Forum einen (oder auch gerne mehrere, falls es verschiedene Themen betrifft) Thread für Deine Fragen eröffnen. Ich bin sicher, dass Du dann auch Antworten in diesem Thread bekommen wirst.
meine Frage wäre bei der Aufgabe c die solve Methode da muss ich halt die zahlen addiern multiplizieren usw. was ich auch hinbekomme.

Aber das Problem ist das die Zahlen auch Falsch sein könnten wie bei Sudoku z.B 1 2 3 4 ist richtig aber 1 3 2 4 wäre Falsch und ich will es so
3 4 1 2 3 4 1 2

schreiben das man die Zahlen in das Feld einträgt und wenn es falsch ist ein schritt zurück geht quasi Backtracking
 
K

kneitzel

Gast
Ich verstehe im Augenblick nicht wirklich, worauf Du hinaus willst. Daher nochmal die Bitte: Mach doch einen neuen Thread für Dein Thema und da erläuterst Du im Detail, was Du hast und was Du gerne ändern möchtest. Ggf. auch mit Dingen, die Du ausprobiert hast oder die Du Dir schon überlegt hast.
 

Neue Themen


Oben