Een Sudoku-oplosser in C

Een Sudoku-oplosser in C is een console-gebaseerd Linux-programma, geschreven in C-taal, dat SU DOKU-puzzels oplost met deductieve logica.
Download nu

Een Sudoku-oplosser in C Rangschikking & Samenvatting

Advertentie

  • Rating:
  • Vergunning:
  • GPL
  • Prijs:
  • FREE
  • Naam uitgever:
  • Bill DuPree
  • Uitgever website:
  • http://www.techfinesse.com/sshutout/sshutout.html

Een Sudoku-oplosser in C Tags


Een Sudoku-oplosser in C Beschrijving

Een Sudoku-oplosser in C is een op console gebaseerd Linux-programma, geschreven in C-taal, dat SU DOKU-puzzels oplost met deductieve logica. Een Sudoku-oplosser in C is een op console gebaseerd Linux-programma, geschreven in C-taal, dat SU DOKU-puzzels oplost met deductieve logica. Het zal alleen toevlucht nemen tot proef-en-error en backtracking benaderingen bij het uitputten van zijn deductieve bewegingen. Puzzles moeten van de standaard 9x9-variëteit zijn met behulp van de (ASCII) -personages 1 tot en met 9 voor de puzzelsymbolen. Puzzels moeten worden ingediend als 81 tekenreeksen die, wanneer het lezen van links-rechts een 9x9 Sudoku-raster van links-naar rechts en van boven-naar beneden zullen vullen. In de puzzelspecificatie vertegenwoordigen de tekens 1 - 9 de puzzelgivens of aanwijzingen. Elk ander niet-leeg karakter vertegenwoordigt een onopgeloste cel. Het puzzeloplossende algoritme is thuisgekweekt. Ik heb geen van de gebruikelijke technieken uit de literatuur geleend, b.v. Donald Knuth's 'Dancing Links'. In plaats daarvan rolde ik mijn eigen krick als een persoonlijke uitdaging. Als zodanig kunnen zijn prestaties alleen de schuld geven aan de jouwe. Toch vind ik het vrij snel. Op een 333 MHz Pentium II Linux-box lost het typische mediumkrachtpuzzels op in ongeveer 800 microseconden of ongeveer 1.200 puzzels per seconde, geven of nemen. Op een Athlon XP 3000 lost het ongeveer 6.600 puzzels per seconde op. (Het oplossen van tijd is afhankelijk van de mate van moeilijkheid, dus YMMV.) Beschrijving van het algoritme: het puzzelalgoritme gaat aanvankelijk aan dat elke onopgeloste cel elke mogelijke waarde kan aannemen. Het gebruikt vervolgens de plaatsing van de GIVENS om de beschikbare keuzes voor elke cel te verfijnen. Ik noem dit de Markup-fase. After Markup is voltooid, het algoritme zoekt dan naar Singleton-cellen met waarden die, als gevolg van beperkingen die worden opgelegd door de regio Rij, kolom of 3x3, slechts één mogelijke waarde aannemen. Zodra deze cellen zijn toegewezen waarden, keert het algoritme terug naar de markup-fase om deze wijzigingen toe te passen in de resterende kandidaat-oplossingen. De markup / Singleton-fasen wisselen af totdat er geen veranderingen optreden, of de puzzel is opgelost. Ik bel de markup / singleton elimination lus de eenvoudige oplosser, want in een groot percentage van de gevallen lost het de puzzel op. Als het eenvoudige solvergedeelte van het algoritme geen oplossing produceert, worden meer geavanceerde deductieve regels toegepast. Ik heb twee aanvullende regels geïmplementeerd als onderdeel van de deductieve puzzeloplosser. De eerste is subset-eliminatie waarbij een rij / kolom / regio wordt gescand voor x aantal cellen met X-aantal bijpassende kandidaat-oplossingen. Indien dergelijke subsets (of tuples) in de rij, kolom of regio worden gevonden, kunnen de kandidatenwaarden van de subset worden geëlimineerd uit alle andere onopgeloste cellen binnen de rij, kolom of regio, respectievelijk. De volgende deductieve regel onderzoekt elk Regio op zoek naar kandidaat-waarden die zich uitsluitend uitlijnen langs een enkele rij of kolom, dwz een vector. Als dergelijke kandidaat-waarden worden gevonden, kunnen ze worden geëlimineerd uit de cellen buiten de regio die deel uitmaken van de uitgelijnde rij of kolom. Aanmerking dat elk van de geavanceerde deductieve regels alle voorafgaande regels noemt, in opdracht Een verandering in puzzelmarkering bewerkstelligen. Finaal, als er geen oplossing wordt gevonden na het toepassen van alle deductieve regels, beginnen we proef-en-fout met behulp van recursie voor backtracking. Een werkkopie wordt gemaakt van onze puzzel en het gebruik van deze kopie De eerste cel met het kleinste aantal kandidaat-oplossingen wordt gekozen. Een van de waarden van de oplossingen is toegewezen aan die cel en het algoritme van de oplosser wordt genoemd met deze werkkopie als uitgangspunt. Uiteindelijk wordt ofwel een oplossing of een impasse bereikt. Als we een impasse bereiken, komt de recursie tot rust en wordt de volgende proefoplossing geprobeerd. Als een oplossing wordt gevonden (op enig moment) worden de waarden voor de oplossing aan een lijst toegevoegd. Nogmaals, zolang we alle mogelijkheden onderzoeken, ontstond de recursie, zodat het volgende proces kan worden geprobeerd. Het is op deze manier dat we puzzels met meerdere oplossingen opsommen .Niet dat het zeker mogelijk is om toe te voegen aan de lijst met toegepaste deductieve regels. De technieken die bekend staan als "x-wing" en "zwaardvis" komen in de zin. Aan de andere kant zal het toevoegen van deze aanvullende regels, op alle waarschijnlijkheid, de oplosser, de oplosser af door toe te voegen aan de computerlast tijdens het produceren van zeer weinig resultaten. Ik heb de wet van het verminderen van rendement zelfs in sommige van de bestaande regels, b.v. In subset-eliminatie kijk ik alleen naar twee en drie gewaardeerde subsets omdat het verder gaat dan die gedegradeerde prestaties. Wat is er nieuw in deze release: · Markup en evaluatieregels zijn opnieuw gefactureerd voor grondigheid en efficiëntie. · De solvermotor is verpakt als een herbruikbare objectmodule. · Het scoresysteem voor puzzel is verbeterd en een bug die vroege splitsing veroorzaakte, werd vastgesteld.


Een Sudoku-oplosser in C Gerelateerde software

Xbomb

XBOMB-project is een mijnenveger spel met driehoekige, vierkante en zeshoekige roosters. ...

315

Downloaden