WinFuture-Forum.de: Bug In Sudokuprüfungsprogramm - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Bug In Sudokuprüfungsprogramm find ihn net :/


#1 Mitglied ist offline   ShadowHunter 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.199
  • Beigetreten: 31. August 04
  • Reputation: 1

geschrieben 04. Dezember 2006 - 20:19

Habe ein Programm geschrieben, welches ein vorgegebenes Sudoku aus einem Array prüfen soll ob es den Regeln entsprechend gelöst wurde.
Dazu sollte ANSI C90 verwendet, werden und praktische Dinge wie Klassen noch nicht genutzt werden.

http://pastie.caboo....la5vlkqmcvv22a5

Das ist der Code.
Der Bug muss in der Funktion sein, in der der Block geprüft wird. Er erkennt manchmal nicht, dass dort eine Zahl mehrmals vorkommt, ich versteh nur nicht warum.
Als Beispiel müsstet ihr das 3. SudokuFeld auskommentieren oder im 2.Feld z.b eine 9 an die 1.Stelle in der 1.Reihe setzen.

Ich kriegs nicht raus wo der Fehler ist, zumal er es oft genug doch richtig erkennt!
Es scheint jedoch die BlockSolved Funktion zu sein.

Dieser Beitrag wurde von ShadowHunter bearbeitet: 04. Dezember 2006 - 20:25

"Wir können Regierungen nicht trauen, wir müssen sie kontrollieren"
(Marco Gercke)
0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 04. Dezember 2006 - 21:02

Jo, die Blockprüffunktion ist total für 'n Popo.

Warum versuchst du nicht etwas a la

for(int a=0; a<3; a++)
	for(int b=0; b<3; b++)
		for(int c=0; c<3; c++)
			for(int d=0; d<3; d++)
				for(int e=0; e<3; e++)
					for(int f=0; f<3; e++)
						if (c != e && d != f && Array[3*a+c][3*b+d]==Array[3*a+e][3*b+f]
							{print("Fehlermeldung"); return 0;}

(a,b) ist der Block, (c,d) und (e,f) sind jeweils die Koordinaten innerhalb eines Blockes.

Man kann's natürlich auch mit 'nem Modulus machen, aber das ist letztendlich auch nur ein Vermischen der Variablen.

Im übrigen betrügt man diese Funktion sehr leicht, indem man einfach ungültige Zahlen verwendet. :blink:

Warum machst du eigentlich jeweils einen vollständigen Vergleich, der sogar noch doppelt ausfällt, wenn du doch einfach die Zahlen im Array durchnummerieren kannst? Oder einfach mal das Arrays sortierst (von mir aus auch mit Counting Sort) und dann einfach mit der Referenz vergleichst?

Dieser Beitrag wurde von Rika bearbeitet: 04. Dezember 2006 - 21:05

Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   ShadowHunter 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.199
  • Beigetreten: 31. August 04
  • Reputation: 1

geschrieben 04. Dezember 2006 - 21:07

Beitrag anzeigenZitat (Rika: 04.12.2006, 21:02)

Jo, die Blockprüffunktion ist total für 'n Popo.

Da sie nur die Reihen und nicht die Spalten berücksichtigt.

Zitat

Im übrigen betrügt man diese Funktion sehr leicht, indem man einfach ungültige Zahlen verwendet. :blink:

Das sowieso :wink: davon sollen wir aber nicht ausgehen.

Zitat

Warum machst du eigentlich jeweils einen vollständigen Vergleich, der sogar noch doppelt ausfällt, wenn du doch einfach die Zahlen im Array durchnummerieren kannst? Oder einfach mal das Arrays sortierst (von mir aus auch mit Counting Sort) und dann einfach mit der Referenz vergleichst?

Wenn wir es bereits verwenden dürften gerne, das ist es ja. Ich muss mit "primitiven" Mitteln das lösen.
Hab nun noch was mit 4 for schleifen ineinander, das ganze 9 mal. Wobei deine 6 forschleifen ineinander evtl. effektiver sind.
"Wir können Regierungen nicht trauen, wir müssen sie kontrollieren"
(Marco Gercke)
0

#4 Mitglied ist offline   SoniX 

  • Gruppe: aktive Mitglieder
  • Beiträge: 696
  • Beigetreten: 19. August 04
  • Reputation: 0
  • Wohnort:Buxtehude

geschrieben 04. Dezember 2006 - 21:13

Ich hätte Interesse an einem Sudoku in COBOL.

Hab dazu aber noch nix gefunden. Immer nur in C oder Java.

Hat da einer was?

Gruß,
SoniX
Eingefügtes Bild
Eingefügtes Bild
Eingefügtes Bild
Eingefügtes Bild
Eingefügtes Bild


System:
E6750 @2x 3.0Ghz, GA-P35 DS3, 3GB MDT , GF8800 GTS 640MB
0

#5 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 04. Dezember 2006 - 21:14

Trotzdem, die Variante mit dem Zählen ist in diesem Falle wesentlich einfacher:

for(int a=0; a<9; a++) {
	int i=0;
	for(int b=0; b<9; b++)
		i |= 1<<(array[a][b]);
	if (i != 0x3FE) {
		print("Fehlermeldung");
		return 0;
	}
}
return 1;

Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#6 Mitglied ist offline   ShadowHunter 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.199
  • Beigetreten: 31. August 04
  • Reputation: 1

geschrieben 04. Dezember 2006 - 21:23

Damit scheints zu gehen, muss zwar int a; und int b; machen, da (warum auch immer), for(int a=0;..) nicht zulässig ist in Ansi C90!

thx, ist auch mit Mitteln gelöst die wir nutzen dürfen!

edit:
Die Verschachtelung der for-Schleifen klappt nicht.
Deine 2.Lösung schon.

auch wenn printf statt print stehen muss und was mich noch wundert:
 i |= 1<<(array[a][b]);


was macht das genau? v.a |= sagt mir nichts, kenn nur !=

Dieser Beitrag wurde von ShadowHunter bearbeitet: 04. Dezember 2006 - 21:32

"Wir können Regierungen nicht trauen, wir müssen sie kontrollieren"
(Marco Gercke)
0

#7 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 04. Dezember 2006 - 21:32

Hm... kann man doch auch gleich für die Blockprüffunktion verwenden:

for(int a=0; a<3; a++)
	for(int b=0; b<3; b++)
		int i;
		for(int c=0; c<3; c++)
			for(int d=0; d<3; d++)
				i |= 1<<(array[a+c][b+d]);
		if (i != 0x3FE) {
			print("Fehlermeldung");
			return 0;
		}


Zitat

Die Verschachtelung der for-Schleifen klappt nicht.

Wer selbständig offensichtlich fehlende Klammern ergänzen kann...


Zitat

was macht das genau? v.a |= sagt mir nichts, kenn nur !=

+= ist dir sicherlich bekannt...

Dieser Beitrag wurde von Rika bearbeitet: 04. Dezember 2006 - 21:36

Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#8 Mitglied ist offline   ShadowHunter 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.199
  • Beigetreten: 31. August 04
  • Reputation: 1

geschrieben 04. Dezember 2006 - 21:39

Beitrag anzeigenZitat (Rika: 04.12.2006, 21:32)

Wer selbständig offensichtlich fehlende Klammern ergänzen kann...

Bei manchen mit Absicht falschen Arrays (Also Sudoku Feldern mit 2 9ern im Block) klappt es teilweise auch nicht.

Dein 1.Code klappt für die BlockPrüfung, der 2. (a<3) komischerweise nicht, obwohl du meintest, der müsste der für den Block sein.

int SudFeld [9] [9] = 
{{6,2,3,7,5,4,1,9,8},{1,4,8,2,6,9,3,7,5},{9,5,7,3,
1,8,6,4,2},
{2,1,9,4,3,7,8,5,6},{5,3,6,8,9,1,4,2,7},{7,8,4,5,2
,6,9,3,1},
{8,9,2,6,4,5,7,1,3},{3,7,1,9,8,2,5,6,4},{4,6,5,1,7
,3,2,8,9}};

Das stimmt, wenn ich das mit deinen letzten beiden Methoden prüfe, kommt trotzdem eine Fehlermeldung...
Bei der Methode mit den ForSchleifen kommt hier ein return von 1, aber wenn ich z.b hinten aus 2,8,9 ein 2,9,9 mache kommt zwar von den Funktionen colSolved und rowSolved ein return 0 aber von der Funktion für den Block nicht!

Beweis:
Für deine letzte Lösung:
http://pastie.caboo.se/25751
Er gibt Fehlermeldung aus, obwohl das Sudoku eindeutig gelöst ist.

Für 2.Lösung:
http://pastie.caboo.se/25752
Auch nicht richtig ./


So jetzt gehts mit den vielen For Schleifen endlich, vlt bringt des auch auf die Spur wo bei dir noch der Fehler ist.
http://pastie.caboo.se/25755

Dieser Beitrag wurde von ShadowHunter bearbeitet: 04. Dezember 2006 - 22:33

"Wir können Regierungen nicht trauen, wir müssen sie kontrollieren"
(Marco Gercke)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0