| Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann. |
Diskussion: Sudoku Cheat-Prog. im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Wer mit der Umsetzung nicht weiter kommt, kann sich ja mal den Quellcode von ksudoku (ziemlich cooles proggi) ankuckn.... gruß ...
![]() |
| | #16 (permalink) |
| Wer mit der Umsetzung nicht weiter kommt, kann sich ja mal den Quellcode von ksudoku (ziemlich cooles proggi) ankuckn.... gruß Corni | |
| | |
| | #17 (permalink) |
| Registriert seit: 03.12.04 ![]() Likes: 0 | Ja, die Aufgabe hört sich gut an. Ich werd mich an einer Java-Lösung versuchen. Gruß, Boar |
| | |
| | #19 (permalink) |
| Registriert seit: 03.12.04 ![]() Likes: 0 | So, hier eine Lösung in Java (siehe Anhang) Zur Steuerung: Mit der linken Maustaste erhöht man den Wert des Feldes um 1, mit der rechten wird der Wert um 1 erniedrigt. Dann drückt man den Button "Lösen" und die Lösung wird angezeigt (Achtung, bei nicht lösbaren Sudokus hängt sich das Programm auf, hab noch nicht herausgefunden, woran das liegt). Bei Gelegenheit verbesser ich vllt. noch die Benutzerfreundlichkeit des Programms, dazu fehlt mir im Moment aber die Zeit (und die Lust). ![]() Hier der interessante Code-Ausschnitt: Die Klasse SudokuSolver Gruß, Boar |
| | |
| | #20 (permalink) |
| Moderator ![]() Registriert seit: 30.03.04 ![]() Likes: 14 | Hallo, hier die Funktion des Knacken in Java: Java |
| | |
| | #21 (permalink) |
| Registriert seit: 14.04.06 ![]() Likes: 4 | Auf dieser Seite werden die kürzesten Sudoku-Solver in verschiedenen Sprachen gesammelt. Der Code ist zwar grauenvoll, dafür aber (in K) nur 101 Bytes groß :http://markbyers.com/moinmoin/moin.c...stSudokuSolver Wer trotzdem nicht so ganz weiterkommt, kann sich zusätzlich zu KSudoku (was eigentlich keine Sudokus löst) mal YASSS anschauen. Das Programm löst jedes lösbare Sudoku, gibt die Anzahl der möglichen Lösungen aus, kann Sudokus erstellen u.v.m. |
| | |
| | #22 (permalink) |
| Registriert seit: 29.04.07 ![]() Likes: 0 | Ich habe auch eine Lösung vorliegen.Man, dafür habe ich aber echt grauenhaft lange gebraucht.Werd sie aber noch verfeinern und optimiern.Noch brauch ich für die allerschwersten (mit 17 vorgegeben Zahlen-für Menschen nicht wirklich schaffbar,oder ?) dieser Welt ca bis zu 7 Sekunden (bis zu 100 Mio Durchläufe).Da kann man noch was rausholen. Die Idee für ein solches Programm ist jedenfalls GENIAL.Danke Elderan.Hat Spaß gemacht.Und man kann es auch noch brauchen. 3,1416 Edit: Hier meine noch immer optmierbare Löung: Code: # include <stdio.h>
# include <time.h>
int sudoku [9] [9];
int setzeFelder [9]={0,0,0,3,3,3,6,6,6};
int i,j,k,o,zahl,r,t,wert,x,dL;
//@sauwichtig: IN C SIND DIE KOORDINATEN EINES 2 DIM ARRAYS: Y X
int darfichquer () {
for (o=0;o<9;o++) {
if(sudoku[i][o]==zahl||sudoku[i][o]==-zahl) {
return 0;
}
}
return 1;
}
int darfichsenkrecht () {
for (k=0;k<9;k++) {
if(sudoku[k][j]==zahl||sudoku[k][j]==-zahl) {
return 0;
}
}
return 1;
}
int darfichkasten (int y, int x) {
x=setzeFelder[x];
y=setzeFelder[y];
if(
sudoku[y][x]==zahl || sudoku[y][x]==-zahl ||
sudoku[y][x+1]==zahl || sudoku[y][x+1]==-zahl ||
sudoku[y][x+2]==zahl || sudoku[y][x+2]==-zahl ||
sudoku[y+1][x]==zahl || sudoku[y+1][x]==-zahl ||
sudoku[y+1][x+1]==zahl || sudoku[y+1][x+1]==-zahl ||
sudoku[y+1][x+2]==zahl || sudoku[y+1][x+2]==-zahl ||
sudoku[y+2][x]==zahl || sudoku[y+2][x]==-zahl ||
sudoku[y+2][x+1]==zahl || sudoku[y+2][x+1]==-zahl ||
sudoku[y+2][x+2]==zahl || sudoku[y+2][x+2]==-zahl
) {
return 0;
}
return 1;
}
int loese (int y,int x,int dasEine,int rueckwaerts) {
dL++;
wert=sudoku[y][x];
if(wert<0&&rueckwaerts==0)
return 1;
if(wert<0&&rueckwaerts==1)
return 0;
if(wert>=0) {
if(dasEine==1)
zahl=wert+1;
else
zahl=1;
while(zahl<=9) {
if((darfichquer()==1&&darfichsenkrecht()==1&&darfichkasten(y,x)==1)) {
sudoku[y][x]=zahl;
return 1;
}else{
zahl++;
}
}
if(sudoku[y][x]==wert) {
return 0;
}
}
return 1;
}
void druckeSudoku () {
int waag,senk;
for(senk=0;senk<9;senk++) {
for(waag=0;waag<9;waag++) {
if(sudoku[senk][waag]>0)
printf("|%d",sudoku[senk][waag]);
else
printf("|%d",sudoku[senk][waag]*-1);
}
printf("|\n");
}
printf("\n");
}
int main (int argc,char ** argv) {
printf("Der Sudoku-Hacker\n");
int A,B,input;
for (A=0;A<9;A++) {
for(B=0;B<9;B++) {
printf("Geben Sie bitte die Reihe %d Spalte %d Zahl an",A+1,B+1);
scanf("%d",&input);
if(input!=0)
input=0-input;
sudoku[A][B]=input;
}
}
printf("\n");
for (i=0;i<9;i++) {//j=x,i=y
for (j=0;j<9;j++) {
x=loese(i,j,0,0);
while(x==0){
if(sudoku[i][j]>0)
sudoku[i][j]=0;
if(j==0) {
i--;
j=8;
x=loese(i,j,1,1);
}else{
j--;
x=loese(i,j,1,1);
}
}
}
}
druckeSudoku();
printf("Sudoku in %d Durchläufen geknackt\n",dL);
return 0;
} |
| | |
| | #23 (permalink) |
| Registriert seit: 22.03.08 ![]() Likes: 0 | Hier mal ein Sudoku-Solver mit tk-gui in perl: clicking here will set off the doomsdaydevice Die Optimierung des Backtrack-Algorithmus ist mit freundlicher Hilfe von mehlvogel @ mrunix.de und diversen Personen aus #perl @ irc.freenode.net geschehen. (Vorher brauchte der Algo auf meinem PC ca. eine viertel Stunde für das Lösen von "Qassim Hamza", jetzt nur noch ca. 1 Minute.) BTW: der solve Button ist lediglich "eyecandy".. edit: jetzt geht der Algorithmus immer den Weg mit den wenigsten Möglichkeiten zuerst, was einen enormen Geschwindigkeitsschub bringt, Idee von BlueJay @ mrunix.de |
| | |
| | #24 (permalink) |
| Registriert seit: 06.04.05 ![]() Likes: 0 | Ich habe auch mal was kleines probiert. Jedoch ist es extrem langsam. Ich hatte jetzt noch keine Zeit, irgendwas zu optimieren. Leider weiss ich auch nicht recht wo anfangen. Ich möchte es optimieren, ohne dass ich Logische Prüfungen einbaue, welche einzelne Teilprobleme lösen. Vielleicht hat da ja jemand eine Idee für mich. Code: #include <stdlib.h>
#include <stdio.h>
int solve(int sudokufeld[9][9], int solvedsudokufeld[9][9]);
int main()
{
int i=0;
int j=0;
char zahl[1] = {0};
int sudokufeld[9][9];
int solvedsudokufeld[9][9] = {0};
printf("Bitte geben sie das ganze Spielfeld an. Alle Eingaben != 1-9 werden als unbekannt angenommen\n");
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
zahl[0] = getch();
sudokufeld[i][j] = atoi(zahl);
printf("%2i", sudokufeld[i][j]);
}
printf("\n");
}
solve(sudokufeld, solvedsudokufeld);
printf("\n\nLoesung:\n");
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
printf("%2i", solvedsudokufeld[i][j]);
}
printf("\n");
}
//printf("\n%i\n", IstMoeglich(sudokufeld));
//Auf q warten
getch();
}
void kopiereSudoku(int quelleSudokufeld[9][9], int zielSudokufeld[9][9])
{
int i, j;
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
zielSudokufeld[i][j] = quelleSudokufeld[i][j];
}
}
}
//0 wenn wiedersprüche
//1 wenn Sudoku OK
int IstMoeglich(int refSudokufeld[9][9])
{
int i, j, zusammenh, zusammenv;
for (i = 0; i < 9; i++)
{
//Horizontal
zusammenh = 0;
zusammenv = 0;
for (j = 0; j < 9; j++) //Alle Zellen zusammenrechnen
{
zusammenh+=refSudokufeld[i][j];
zusammenv+=refSudokufeld[j][i];
}
if (zusammenh != 45 || zusammenv != 45)
return 0;
}
return 1;
}
int solve(int refSudokufeld[9][9], int solvedSudokufeld[9][9])
{
int i, j, k;
int tempsudokufeld[9][9];
for (i=0;i<9;i++)
{
for (j=0;j<9;j++)
{
//Das Feld darf nur bearbeitet werden, wenn es unbekannt ist
if (refSudokufeld[i][j] == 0)
{
for (k = 1; k <= 9; k++)
{
kopiereSudoku(refSudokufeld, tempsudokufeld);
tempsudokufeld[i][j] = k;
//Wenn Sudoku nun gelöst, dann 1 zurück
if (IstMoeglich(tempsudokufeld))
{
kopiereSudoku(tempsudokufeld, solvedSudokufeld);
return 1;
}
else //Sonst sich selber aufrufen
{
if (solve(tempsudokufeld, solvedSudokufeld))
return 1;
}
}
}
}
}
return 0;
} |
| | |
| | #25 (permalink) |
| Registriert seit: 21.04.08 ![]() Likes: 0 | Java - zu faul für OOP. Code: public class Sudoku {
/**
* @param args
*/
public static void main(String[] args) {
int[][] grid = new int[9][9];
int[] data = { 0,0,0,0,0,0,0,0,0, 0,7,0,0,4,0,0,1,0, 3,0,1,5,0,6,4,0,8,
0,0,0,0,0,0,0,0,0, 0,6,0,0,1,0,0,4,0, 1,0,5,7,0,9,8,0,3,
0,0,0,0,0,0,0,0,0, 0,3,0,0,7,0,0,2,0, 2,0,4,8,0,5,7,0,9 };
fillGrid(data, grid);
printGrid(grid);
if(solve(0, 0, grid))
printGrid(grid);
else
System.out.println("Keine Lösung");
}
/**
* @param grid - Sudokufeld
*/
public static void printGrid(int[][] grid){
for(int i=0; i<grid.length; i++) {
for(int z=0; z<grid[i].length; z++) {
if((i%3) == 0 && z == 0)
System.out.println("-------------------------");
if((z%3) == 0)
System.out.print("| ");
System.out.print(grid[i][z] +" ");
if(z == grid[i].length-1)
System.out.print("|");
}
System.out.println("");
}
System.out.println("-------------------------\n\n");
}
/**
* @param data - Array mit den Zahlen
* @param grid - Sudokufeld
*/
public static void fillGrid(int[] data, int[][] grid){
int x = -1;
for(int i=0; i<81; i++){
if((i%9) == 0)
x++;
grid[x%9][i%9] = data[i];
}
}
/**
* @param row - Zeile
* @param col - Spalte
* @param grid - Sudokufeld
* @return true/false - Lösung gefunden / keine Lösung gefunden
*/
public static boolean solve(int row, int col, int[][] grid){
if(row == 9){
row = 0;
col++;
if(col == 9)
return true;
}
if(grid[row][col] > 0)
return solve(row+1, col, grid);
for(int x=1; x<10; x++) {
if(check(row, col, x, grid)) {
grid[row][col] = x;
if(solve(row+1, col, grid))
return true;
}
}
grid[row][col] = 0;
return false;
}
/**
* @param row - Zeile
* @param col - Spalte
* @param x - Wert
* @param grid - Sudokufeld
* @return true/false - kann gesetzt werden / kann nicht gesetzt werden
*/
public static boolean check(int row, int col, int x, int[][] grid){
for(int i=0; i<9; i++)
if(x == grid[i][col])
return false;
for(int i=0; i<9; i++)
if(x == grid[row][i])
return false;
int rowBlockFirst = (int)(row/3)*3;
int colBlockFirst = (int)(col/3)*3;
for(int i=0; i<3; i++)
for(int z=0; z<3; z++)
if(x == grid[rowBlockFirst+i][colBlockFirst+z])
return false;
return true;
}
} |
| | |
| | #26 (permalink) |
| Registriert seit: 15.10.06 ![]() Likes: 0 | Hab auch mal eine PHP Klasse für Sudokus erstellt, aber nur um diese zu generieren und am Schluss zu überprüfen. Wer sie mal ausprobieren möchte: http://www.thomas-wollmann.de/sonstiges/sudokutest.php MFG HKA |
| | |
| | #27 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() Likes: 156 | Eine etwas andere Lösungsweise: Wir betrachten einmal die Regeln: es gibt Zeilen, Spalten und Blöcke. Darin sollen Ziffern von 1 bis N stehen. Weder in einer Zeile,noch Spalte noch Block soll eine Ziffer doppelt vorkommen. D.h ein intelligenter Brutforcer sollte beim Ausprobieren erstmal berücksichtigen, welche Ziffern überhaupt als Kandidaten in Frage kommen, bevor er etwas einträgt. Damit wären wir auch schon bei der Lösung http://de.wikipedia.org/wiki/Constraintprogrammierung Umsetzung (ja, in diesem Stück Code steckt wirklich sowohl der "Löser" wie auch der "Korrektheit-Checker" sudoku.pl, Sicstus Version,mit SWI kompatibel Jetzt die 2 Begleitmodule: sudoku_prettyprint processfile, liest die Datei ein und zerlegt das Spielfeld in Zeilen/Spalten/Blöcke Diese Sichtweise ist nicht nur extrem bequem bei dieser Problemstellung - sie ist auch viel effizienter, als reines BF. Bsp: "Near worst case" sudoku puzzle for brute force solver" http://en.wikipedia.org/wiki/Algorit...orce_algorithm sudoku als programminput Ausgabe: Ausgabe Die Messzeit beinhaltet den kompletten Vorgang -auch das Lesen/Parsen des Spielfeldes von der Festplatte Andere: Eastermonster,tarek,golden nugget Nutzung: solve(Filename). Spielfeldformat: wie in Wikipedia - entweder Ziffern oder Platzhalter(0 oder . (Punkt)), Zeilenumbrüche sind egal. Wer andere Zeichen als Platzhalter nutzen möchte, sollte sie in 'processfile' (ab Zeile 1 - siehe Kommentar) eintragen. Spielfeldgrößen: dynamisch. Allerdings gibt es 2 Sachen - zum einen muss bei exotischen Boards die Blockauteilung noch eingetragen werden (wieviele Zeilen/Spalten in einem Block sein sollen). Zum anderen hatte ich dann keine Lust mehr
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #28 (permalink) |
| Registriert seit: 19.01.07 ![]() Likes: 2 | koennte einer fuer mich das entschluesseln eines sudoku spiels in eine mathematische Formel bringen? |
| | |
| | #29 (permalink) |
| Moderator ![]() Registriert seit: 30.03.04 ![]() Likes: 14 | Hallo, glaube kaum, dass es eine mathematische Formel gibt, die das Lösen eines Soduks beschreibt. Und mathematische Formeln/Sätze für etwas komplexere Probleme sind so extrem kompliziert, dass du sie vermutlich eh nicht verstehen wirst und es leichter ist ein Programm/Algorithmus nachzuvollziehen. |
| | |
| | #30 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() Likes: 156 | Nunja, in der DE Wikipedia steht ja schon ein Ansatz: http://de.wikipedia.org/wiki/Sudoku#...ische_Methoden die englische bietet sogar eine Extraseite dazu http://en.wikipedia.org/wiki/Algorithmics_of_sudoku allerdings kommt dabei die Mengenlehre/Stochastik zum Einsatz.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
![]() |
| | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Sudoku-Generator | CDW | Programmieraufgaben | 1 | 04.08.09 02:12 |
| Sudoku | Ook! | Code Kitchen | 2 | 25.05.08 11:00 |
| The Cheat Report | stone.dr | Fun Section | 17 | 20.03.06 15:18 |
| Sudoku programmieren | jami | Code Kitchen | 1 | 16.10.05 15:05 |