Linkweg: Home / Zahlenrätsel / Sudoku / Skripte / Klasse: sudoku_guess / Methode: guess()
Methode: sudoku_guess::guess()
| PHP-Code | |
|---|---|
| 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: |
<?php function guess() { if (12 < time()-$this->chkTime) { $this->arrZeilen = $this->arrStart; $this->aktualisieren(); return true; } //Backup if (!is_array($this->arrStart[0])) $this->arrStart = $this->arrZeilen; $this->arrBackup = $this->arrZeilen; //Ein Wert wird geraten $tmp = 0; $z = $this->count1; for ($x=0;$x<9;$x++) { for ($y=0;$y<9;$y++) { if (9 < $this->arrZeilen[$x][$y] && 0 == $tmp) { if (0 == $z) { $str = substr($this->arrZeilen[$x][$y],0,1); $this->arrZeilen[$x][$y] = $str; $tmp++; } else { $z--; } } } if (0 != $tmp) break; } //Mit dem geratenen Wert wird weitergerechnet $this->solve(); //Ergebnis wird ueberprueft $this->check(); //Wenn das Ergebnis falsch ist, wird mit dem Backup der naechste //Wert geraten if ('error' == $this->status) { $this->count3++; if (10 < $this->count3) { $this->arrZeilen = $this->arrStart; $this->count1 = $this->count2 + 1; $this->count2 = 0; $this->count3 = 0; $this->guess(); } else { $this->arrZeilen = $this->arrBackup; $this->count1++; $this->guess(); } //Ist die Loesung noch nicht eindeutig, wird weitergeraten } elseif ('unfinished' == $this->status) { if (0 == $b) { $this->count2 = $this->count1; $this->count1 = 0; $this->guess(); } else { $this->count1 = 0; $this->guess(); } } } ?> |
sudoku_guess::guess() rät einen oder mehrere Werte für das zu lösende Sudoku-Rätsel.
Sollte durch zu häufiges Raten die Berechnung länger als 12 Sekunden dauern, so wird das Skript
abgebrochen.
Beim ersten Durchlauf der Methode sudoku_guess::guess() wird ein Backup von $arrZeilen erstellt.
Außerdem wird bei jedem Durchlauf ein Backup des vorigen Standen von $arrZeilen erstellt.
Dann wird ein Wert geraten. Dieses "Raten" ist aber kein Raten im eigentlichen Sinne, sondern vielmehr ein
systematisches Probieren mit Hilfe der Durchlaufzähler.
Mit dem geratenen Wert wird weitergerechnet. Das Ergebnis der Berechnung wird geprüft.
Sollte das mit dem geratenen Wert errechnete Ergebnis falsch sein ($status = "error"), wird mit veränderten
Durchlaufzählern und einem Backup weitergeraten.
Sollte die Lösung noch nicht eindeutig sein ($status = "unfinished"), wird erneut geraten.
Ist das Ergebnis jedoch vollständig und richtig, so wird das Ergebnis im nächsten Schritt
ausgegeben.











