Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  Rekursive Funktion mit 2d array als parameter (Sudoku-Backtracking)     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
sadmarvin
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.09.2010
Beiträge: 4
Beitrag sadmarvin Mitglied 12:50:40 01.09.2010   Titel:   Rekursive Funktion mit 2d array als parameter (Sudoku-Backtracking)            Zitieren

Hi,

ich habe gerade angefangen C zu lernen. Aber bei diesem ganzen Zeiger Kram steig ich noch nicht wirklich durch.

ich habe in Python ein Programm zum lösen von Sudokus per Backtracking und versuche nun dies in C zu programmieren.

die rekursive Funktion zum lösen sieht in python so aus:
http://pastebin.com/bS7nhyqR

in C habe ich es so versucht:
http://pastebin.com/7E4dSsHU
(die Funktion allowed habe ich nicht mit gepostet)

aber das funktioniert nicht richtig.
Es wird das leere Sudoku ausgegeben, aber dann scheint das Programm irgendwie in einer Endlosschleife zu stecken.

Wenn ich in der Funktio die Abfrage
Code:
if (solve(feld) != NULL)
Code:
if (solve(feld) != NULL)
Code:
if (solve(feld) != NULL)

in
Code:
if (solve(feld) == NULL)
Code:
if (solve(feld) == NULL)
Code:
if (solve(feld) == NULL)

ändere, läuft das Prog. bis es die erste Zelle findet, für die keine Zahl gültig ist. Also es wird das leere Sudoku ausgegeben, und dann das Sudoku mit den bis zum abbruch gefundenen Zahlen.

Irgendwie scheint die Rekursion nicht so ganz zu funktionieren.
Wie gesagt, bin ich mit Zeigern, Rekursion und so noch sehr unsicher.

Wo liegt denn der Fehler. Muss ich dass Array evtl. anders an die Funktionen übergeben?
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2103
Beitrag Wutz Mitglied 14:50:39 01.09.2010   Titel:              Zitieren

Du läufst u.a. von 1..10, sollte das nicht 1..9 sein?
Am Ende der Funktion fehlt ein return, hier sollte wohl irgendwas für !=NULL stehen? Vielleicht solltest du einfach den return-Typ von void* auf int ändern, ist einfacher für diesen Fall.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
sadmarvin
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.09.2010
Beiträge: 4
Beitrag sadmarvin Mitglied 15:49:35 01.09.2010   Titel:              Zitieren

ups ja muss natürlich n<10 sein und nicht n<=10

aber mit return-typ int und einem "return 1" am Ende funktioniert es auch nicht.
http://pastebin.com/p9RxVJ6W

wenn ich das "return 1" eine Klammer weiter nach innen packe, geht es bis zur ersten Zeile. also:
Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
Code:
1
2
3
4
5
6
7
8
9
1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
Code:
1
2
3
4
5
6
7
8
9
1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

Bei noch einer Klammer weiter nach innen, nur die erste Zahl. Das ist ja auch zu erwarten. Aber wenn das return 1 am ende steht startet das Programm und die Funktion "hängt irgendwo fest".


Zuletzt bearbeitet von sadmarvin am 15:52:04 01.09.2010, insgesamt 1-mal bearbeitet
sadmarvin
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.09.2010
Beiträge: 4
Beitrag sadmarvin Mitglied 21:33:47 01.09.2010   Titel:              Zitieren

also ich habe jetzt im netz was gefunden was funktioniert, aber dazu hab ich noch mal eine frage:

http://pastebin.com/jQytjzRf

Die Funktion fängt oben links an und arbeitet dann spalte für spalte ab.

wenn ich jetzt in den Zeilen 14 bis 19 n und m vertausche, müsste sie ja auch oben links anfangen, aber dann zeilenweise weitermachen. Genau das funktioniert aber nicht. Dann verhält sie sich genauso wie meine erste. (die geht ja auch zeilenweise vor)

Weiss jemand woran das liegt, das es nicht funktioniert wenn man m und n vertauscht?

EDIT:
hmm, seltsam, ich habe die erste funktion grad nochmal eingegeben und die geht jetzt auf einmal. War vielleicht irgendwo nen tippfehler oder so?!

Aber das mit dem n und m vertauschen verstehe ich nicht.


Zuletzt bearbeitet von sadmarvin am 22:20:52 01.09.2010, insgesamt 1-mal bearbeitet
C/C++ Forum :: C (C89 und C99) ::  Rekursive Funktion mit 2d array als parameter (Sudoku-Backtracking)   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.