Heb gezocht, helaas geen topics hierover.
Puur voor vermaak ben ik bezig geweest met het maken van een sudoku solver. Een belangrijk gegeven is dat ik niet de intentie heb snelle of efficiente code te schrijven, ik heb het dus aangepakt volgens de rapid style methode (alle mogelijke combinaties proberen tot de juiste is gevonden)
Wat is gelukt:
iemand die hulp kan bieden??
Hieronder volgt de functie, deze gebruikt een associatieve array[x][y] = waarde, waarbij x het rijnummer is en y het kolomnummer, gerekend vanaf het blokje rechtsboven (0=1). In de functie wordt de functie verify($array) aangeroepen, deze returned true of false afhankelijk van de correctheid van de sudoku tot op dat punt. edit: $size is de afmeting van de sudoku, een 3 betekent een 3x3 sudoku, de code moet namelijk instaat zijn "alle" verschillende soorten sudokus op te lossen (ik weet dat het qua processorpower bijna onmogelijk is op deze wijze een 4x4 op te lossen maar toch)
Puur voor vermaak ben ik bezig geweest met het maken van een sudoku solver. Een belangrijk gegeven is dat ik niet de intentie heb snelle of efficiente code te schrijven, ik heb het dus aangepakt volgens de rapid style methode (alle mogelijke combinaties proberen tot de juiste is gevonden)
Wat is gelukt:
- Het checken van een array van waardes of deze voldoen aan de randvoorwaarden van de sudoku (horz. vert. block. integrity zeg maar)
- Een aantal for/foreach loops die alle waardes proberen in chronologische volgorde
- Het recursief aanroepen van de functie om de volgende waarde te proberen
iemand die hulp kan bieden??
Hieronder volgt de functie, deze gebruikt een associatieve array[x][y] = waarde, waarbij x het rijnummer is en y het kolomnummer, gerekend vanaf het blokje rechtsboven (0=1). In de functie wordt de functie verify($array) aangeroepen, deze returned true of false afhankelijk van de correctheid van de sudoku tot op dat punt. edit: $size is de afmeting van de sudoku, een 3 betekent een 3x3 sudoku, de code moet namelijk instaat zijn "alle" verschillende soorten sudokus op te lossen (ik weet dat het qua processorpower bijna onmogelijk is op deze wijze een 4x4 op te lossen maar toch)
PHP:
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
| function checkSudoku() { global $original_array, $current_array, $counter, $size; // globale variabelen if(verify($current_array)) { // als de huidige sudoku valideerd foreach($current_array as $row => $column_array) { // voor elke rij foreach($column_array as $column => $value) { // voor elke kolom if($original_array[$row][$column] != null) { // als het originele vakje ingevuld was (in de opgave) continue; // ga door naar volgende } else if($current_array[$row][$column] == null) { // als het huidige vakje leeg is for($x=1; $x <= pow($size,2); $x++) { // voor alle mogelijke waardes (1-9 voor een 3x3) $current_array[$row][$column] = $x; // zet een waarde in het huidige vakje if(verify($current_array)) { // kijk of de sudoku valideerd $counter++; if(checkSudoku()) { // roep de functie recursief aan echo "de oplossing is gevonden"; } else { // als er false terug komt continue; // ga door met de volgende mogelijkheid } } else { // als de sudoku niet valideerd if($x==9) { // als de counter tot 9 is gekomen, is er dus een mogelijkheid geprobeerd die niet tot een oplossing leidt en, $current_array[$row][$column] = ""; // moet het huidige vakje weer blanco worden gemaakt //$counter--; return false; // en wordt er false terug gegeven } if($counter >0) { print_r($current_array); $current_array[$row][$column] = ""; } } } } } } } else { die("De begin sudoku is ongeldig!!"); } } |
[ Voor 4% gewijzigd door Verwijderd op 09-02-2007 14:47 ]