Fun... verveling... noem het wat je wilt.
Het feit is dat achter elk sudoku raadsel een algoritme steekt wat ik probeer te achterhalen. Het algoritme wordt rap achterhaald door het menselijk verstand, maar om een computer de spelregels duidelijk te maken ben je morgen nog niet klaar. Vandaar dat ik der vandaag al mee begon:p.
Waar komt het op neer: ik wilde dus het sudoku systeem laten printen, maar dan random. Zodat ik telkens een nieuwe (echte) sudoku puzzel had. Allemaal goed en wel, maar hoe begin ik hier aan. Zitten denken, en voor de horizontale en verticale ben ik er bijna uit. Hoe ik het vierkant ga oplossen zie ik een andere keer wel... (als iemand een idee heeft, altijd welkom:)).
Maar goed, ik zit nu nog te sukkelen met horizontale en verticale. Terwijl dit eigenlijk niet zo moeilijk hoeft te zijn denk ik.
Ik werk, zoals verwacht, met arrays. Ik maak eerst een 2D array aan, die ik daarna vul. Om het horizontaal te laten kloppen ga ik gewoon met een while om een random getal heen en controleer ik of het al is geweest. Zoja, dan herhalen, zo neen: getal onthouden en opslaan als een element van mijn array.
Nu voor verticaal heb ik zitten denken om een tweede 2D array te maken, en daarin telkens de originele sudoku array in te kopieren en kijken of ik dit gegeven er in MAG steken. Maar bij deze fase loopt het mis. Als ik horizontaal niet controleer, dan werkt deze methode, maar ik de twee combineer loopt het vast.
Dit resulteert in een, tot mijn spijt, oneindige loop. Als je nu bv. de verticale controle weglaat, dan werkt het horizontaal wel, en als je het horizontaal weglaat werkt het verticaal. Dus afzonderlijk werken ze. Ik heb zitten denken aan zoiets:
Laat de ingevulde cijfers staan en vul de rest in volgens de drie regels van het spel. Op elke horizontale én elke verticale regel alle cijfers van 1 tot en met 9 invullen en dat tegelijkertijd ook nog eens zodat in elk van de 9 vierkanten van 3x3 vakjes de cijfers van 1 tot en met 9 staan.
zoals je ziet komt elk getal van 1 tot 9 van boven naar onder maar 1 keer voor, van links naar rechts idem. (tot hier probeer ik ,te geraken).
Een extra aan sudoku is dat elke vierkant (bv. linksonder, een vierkant van 3) ook maar 1x de cijfers van 1 tot 9 in voorkomen.
heb het een tijdje geleden ook geprobeert om te maken.
werkt momenteel nog steeds niet (niet dat ik eraan verderdoe he ) maar het heeft al wel een 1200tal lijnen code.
Ik controleerde alles dmv 81 (9*9) if-loops waarin hij voor elke gevonden waarde moest nazien of het getal al ingevuld was horizontaal, verticaal en in het vierkant.
Heb het met een if-loop gedaan omdat ik geen andere manier vond om het vierkant op te lossen.
Het enige wat ik nog niet had erbij gezet was dat hij voor elke mogelijke oplossing in een vakje alle waardes moest proberen ipv de eerste.
Als je wil kan ik het script doorsturen, maar ik ga het hier niet posten, de pagina zou wat lang worden met alle 1200 regels
Joel - 14/07/2005 18:22 (laatste wijziging 14/07/2005 18:26)
Eigenaar
Ja ik gemaakt 200 lijnen ofzo. In't begin deed ik het ook zo door alles te controleren, of er op elke rij en kolom 9 verschillende cijfers zijn en dat elke 3x3 matrice 9 verschillende cijfers bevat. Maar nu werkt hij anders.
en dan doet PHP er random cijfers uit, dan als men op CHECK drukt dan controleert men of alles correct is. Het enigste probleem nu nog is die puzzels random genereren, maar dat kan je ook handmatig doen. Vb de eerste rij mag je met de tweede en de derde wisselen en ook de tweede met de derde. Zo ook met de kolommen. Misschien dat je dan zo puzzels kunt genereren?
Enja, ik gemaakt, en niet in één uur Mijn bedoeling was om eigelijk een website te maken, met allemaal puzzels. In het begin gemakkelijke puzzels dat je maar enkele cijfers moet invullen, en dan op't einde heel moeilijke puzzels dat er maar één mogelijkheid is om deze op te lossen en je toch nog bijna alle cijfers moet invullen.
Je moet dus iets schrijven dat als eindresultaat (postconditie) een 9x9 matrix oplevert die voldoet aan die 3 eisen. Het beste (?) kun je met een random matrix beginnen, en dan alle cijfers op zijn plaats zetten of deze random vullen... Hierbij kun je misschien gebruik maken van de voorwaarden in het eindresultaat - bijv. dat je van elke plaats twee verzamelingen bijhoudt die aangeeft welke getallen daar / waar nog mogen staan. Ga dus uit van de eisen waaraan het resultaat moet voldoen.
Mooi dat je hier aan bezig bent, ik ga daar zelf ook eens even naar kijken. Eerst ga ik mijn 'tel' scriptje afmaken (alle cijfers tem 100.000.000...) in het nederlands laten schrijven.
Als ik ermee bezig ben dan wil ik wel eens kijken.