Sudoku mit Brute-Force Algorithmus

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
chef-87
Beiträge: 1
Registriert: Fr Jun 07, 2013 12:03 pm

Sudoku mit Brute-Force Algorithmus

Beitrag von chef-87 » Fr Jun 07, 2013 12:04 pm

hey leute,
wir müssen ein sudoku-lösendes c-programm mit brute-force algorithmus schreiben. die zahlen werden über eine textdatei eingelesen (programm muss allerdings den speicherort nicht abfragen!). leider kriegen wir's nicht so ganz hin... :)
wenn wir das programm starten, laufen zahlen durch! wenn man dieses pausiert:
"Loesung XXX:
123456789
456789123
789123456
..."

was machen wir falsch, bzw. wie geht's richtig?? wär super, wenn uns jmd. helfen könnte! :D

UNSER CODE (die main-funktion ist ganz unten):


Code: Alles auswählen

#define _CRT_SECURE_NO_WARNINGS		/* Fehlermeldung für alte Stringfunktionen unterdrücken */
#include <stdio.h>

/* Überprüfung der Zeilen, Spalten */
#define N 9							/* Größe des Sudokus */
static int feld[N][N];
static int loesungen = 0;

int createSudoku(char *dateiname);
void printSudoku();
int solve(int x, int y);
int checkBox(int x, int y, int wert);
int checkVertikal(int x, int wert);
int checkHorizontal(int y, int wert);
int check(int x, int y, int wert);

/* Felder auf Zahlen überprüfen (0 = leeres Feld, 1 = Zahl gefunden) */
int check(int x, int y, int wert) {
	if(checkHorizontal(y, wert))
		return 1;
	if(checkVertikal(x, wert))
		return 1;
	if(checkBox(x, y, wert))
		return 1;
	return 0;   
}

/* Überprüfung der Horizontalen auf Zahl (0 = nein, 1 = ja) */
int checkHorizontal(int y, int wert) {
	int i;
	for(i = 0; i < N; i++)
		if(feld[y][i] == wert)
			return 1;
	return 0;
}

/* Überprüfung der Vertikalen auf Zahl (0 = nein, 1 = ja) */
int checkVertikal(int x, int wert) {
	int i;
	for(i = 0; i < N; i++)
		if(feld[i][x] == wert)
			return 1;
	return 0;
}

/* Überprüfung der 3x3-Box auf Zahl (0 = nein, 1 = ja) */
int checkBox(int x, int y, int wert) {
	int x_box, y_box, i, j;
	/* Passende Ecke der Box herausfinden */
	x_box = (int)(x / 3) * 3;
	y_box = (int)(y / 3) * 3;
	for(i = y_box; i < y_box + 3; i++)
		for(j = x_box; j < x_box + 3; j++)
			if(feld[i][j] == wert)
				return 1;
	return 0;
}

/* Alle Lösungen für ein Sudoku, Startwert x, y: 0, 0
* 1 Zahl passt
* 0 Zahl passt nicht
*/
int solve(int x, int y) {
	int i;
	if(x == N) {					/* Zeilenende erreicht */
		y++;
		x = 0;
		if(y == N)					/* Ende erreicht */
			return 1;
	}   

	if(feld[y][x] > 0)				/* Feld schon gesetzt */
		return solve(x+1, y);		/* Nächstes Feld */

	for(i = 1; i <= N; i++) {		/* Keine Zahl vorhanden */
		if(!check(x, y, i)) {		/* Alle Zahlen durchgehen, DIESES CHECK FÜR DAS OBERE SOLVE SETZEN*/
			feld[y][x] = i;			/* Wenn Zahl passt, setzen */
			if(solve(x+1, y)) {		/* Nächstes Feld prüfen */
				loesungen++;        /* Lösung gefunden, ausgeben */
				printf("Loesung %d:\n", loesungen);
				printSudoku();
				printf("\n");
				return 1;			/*<-- Nur eine Loesung ausgeben */
			}
		}
	}

	feld[y][x] = 0;					/* Keine Zahl hat gepasst, wieder 0 setzen */
	return 0;
}

/* Ausgabe */
void printSudoku() {
	int i, j;
	for(i = 0; i < N; i++) {
		for(j = 0; j < N; j++) {
			printf("%d", feld[i][j]);
		}
		printf("\n");
	}
}

int main() {

	int iAuswahl;
	printf("SUDOKU - MENUE\nBitte waehlen Sie!\n");
	printf("1. Spiel starten\n2. Beenden\n\n");
	scanf("%d", &iAuswahl);
	if(iAuswahl==1)
	{
		solve(0, 0);
		printf("Loesungen: %d\n", loesungen);
		return 0;
	}
	else
		if(iAuswahl==2)
		{
			return 0;
		}
}
Edit by cloidnerux: Code-Tags hinzugefügt

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Sudoku mit Brute-Force Algorithmus

Beitrag von cloidnerux » Fr Jun 07, 2013 12:33 pm

Hi und Willkommen im Forum :)
was machen wir falsch, bzw. wie geht's richtig?? wär super, wenn uns jmd. helfen könnte!
In einer solchen Aussage liegt schon der erste Fehler, denn hier wird schon deutlich, dass ihr selber keine Ahnung habt, was ihr überhaupt machen müsst. Daraus kann doch kein Algorithmus entstehen.

Daher solltet ihr erstmal Logisch an die Sache herangehen:
Punkt 1: Ihr braucht eine Funktion/Algorithmus, die Prüft ob ein Soduko gewonnen ist, bzw Gültig ist.
Punkt 2: Ihr ladet euer Sodukfeld aus eurer Datei und gebt erstmal die Festgelegten Felder an. Sinnvoller weise legt man sich ein 9 mal 9 Array aus Strukturen an, die neben der egt Zahl auch einen Indikator haben, ob dies fest ist, also nicht geändert werden darf.
Punkt 3: Ihr Initiert alle anderen Felder mit 1
Nun könnt ihr das 9 mal 9 Feld aus als 81 Zeichen lange Zahl darstellen, wobei ihr die mehr als 17 festgelegten Felder außen vor lassen könnt
1385927493.......12911
Wobei nur die Ziffern 1 - 9 erlaubt sind. Nun könnt ihr einfach die Zahl erhöhen, wobei ihr immer die letzte Stellle um 1 erhöht bis es 10 erreicht und dementsprechend die nächste Stelle erhöht werden muss.
Nach jeder Inkrementation wird überprüft, ob es sich um ein valides Soduko handelt.

Und nachdem ich jetzt mal durch euren Code geagen bin, merke ich das ihr kein Soduko aus irgendeiner Datei ladet, daher habt ihr ein komplett leeres Soduko-Feld.

MfG cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: Sudoku mit Brute-Force Algorithmus

Beitrag von Nemo » Fr Jun 07, 2013 6:59 pm

chef-87 hat geschrieben:hey leute,
wir müssen ein sudoku-lösendes c-programm mit brute-force algorithmus schreiben.
Hi,
ohne den Code gelesen zu haben, warum muss es unbedingt ein brute-force-Algorythmus sein?

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Sudoku mit Brute-Force Algorithmus

Beitrag von sebix » Mi Jun 19, 2013 7:56 pm

Nemo hat geschrieben:
chef-87 hat geschrieben:hey leute,
wir müssen ein sudoku-lösendes c-programm mit brute-force algorithmus schreiben.
Hi,
ohne den Code gelesen zu haben, warum muss es unbedingt ein brute-force-Algorythmus sein?
Weil es am einfachsten ist und immer noch schnell genug ist?

Antworten