# Kendoku



## Jacker (13. Nov 2012)

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.



```
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();
		}
	}
}
```


----------



## Trolllllll (13. Nov 2012)

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


----------



## bERt0r (13. Nov 2012)

Wenn du nicht verstanden hast wie Kendoku funktioniert (das hab ich aus der Beschreibung auch nicht herauslesen können) auf Wikipedia sieht mans auf einen Blick: KenKen - Wikipedia, the free encyclopedia (runterscrollen zum Beispielbild)


----------



## Jacker (13. Nov 2012)

@ Trolllllll

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


----------



## Trolllllll (14. Nov 2012)

Jacker hat gesagt.:


> @ 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 (14. Nov 2012)

Jacker hat gesagt.:


> 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 

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*


----------



## Jer (14. Nov 2012)

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 )


----------



## JohnDoe@AuD (16. Nov 2012)

Jacker hat gesagt.:


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



JohnDoe (Dozent und Aufgabensteller) hat ein Auge auf diesen Thread geworfen und behält ihn im selbigen...


----------



## bERt0r (16. Nov 2012)

Tja, so kanns gehen.


----------



## SuperCode55005 (18. Nov 2012)

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


----------



## Fabian04088 (6. Dez 2020)

Hey könntest du mir die Lösung weiter leiten?


----------



## kneitzel (6. Dez 2020)

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....


----------



## Fabian04088 (6. Dez 2020)

Das ist traurig aber Hoffnungen kann man noch haben


----------



## Fabian04088 (6. Dez 2020)

kneitzel hat gesagt.:


> 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....


Dürfte ich dir trotzdem über dieses Thema fragen stellen?


----------



## kneitzel (6. Dez 2020)

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 (6. Dez 2020)

kneitzel hat gesagt.:


> 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


----------



## Fabian04088 (6. Dez 2020)

Die zahlen sollen so aussehen
1 _ 2 _ 3 _ 4 __1 _ 3 _ 2 _ 4
3 _ 4 _ 1 _ 2 __3 _ 4 _ 1 _ 2


----------



## kneitzel (6. Dez 2020)

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.


----------

