Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 25. 10. 2012 16:29 — Editoval mountdoom (25. 10. 2012 16:31)

mountdoom
Příspěvky: 186
Reputace:   
 

Python 2 - nespravne odstraneni z vnoreneho seznamu

Zdravím,

delám program v Pythonu, který vyřeší sudoku pomocí lidských metod. Nyní se snažím přijít na to, jak udělat "metodu jednoho kandidáta" tzn. pokud v řádku, sloupci nebo menším čtverci je jen jedno chybějící políčko, doplní se dle pravidel sudoku.

Zdrojový kód:

Code:

sudoku=[[0, 0, 0, 9, 2, 7, 5, 6, 8],
        [6, 9, 2, 1, 8, 5, 7, 3, 4],
        [8, 5, 7, 4, 6, 3, 1, 9, 2],
        [1, 3, 4, 2, 9, 6, 8, 7, 5],
        [2, 7, 8, 5, 3, 4, 6, 1, 9],
        [5, 6, 9, 7, 1, 8, 4, 2, 3],
        [4, 2, 5, 3, 7, 1, 9, 8, 6],
        [9, 1, 6, 8, 4, 2, 3, 5, 7],
        [7, 8, 3, 6, 5, 9, 2, 4, 1]]

index = -1
n = 0
ungiven = []
#skenovani pole, abychom nasli nepredvyplnene bunky
#do seznamu se ukladaji indexy (pozice) prazdnych bunek
while n < 9:
    for i in sudoku[n]:
        index+=1
        if i == 0:
            ungiven.append(index)
    n+=1
#vnoreny seznam kandidatu pro kazde policko, na zacatku vzdy 1-9
#seznamu je tolik, kolik je nepredvyplnenych policek
moznosti = len(ungiven) * [[1,2,3,4,5,6,7,8,9]]
#p udava, na kolikate pozici se pohybujeme v seznamu ungiven
p=0
while p < len(ungiven):
    #prepocet na souradnice v poli sudoku    
    x = ungiven[p]%9
    y = ungiven[p]/9
    #metoda jednoho kandidata (ve sloupci)
    for m in col(x):
        if m in moznosti[p]:
            moznosti[p].remove(m)
    if len(moznosti[p]) == 1:
        sudoku[y][x] = moznosti[p][0]
    p+=1

Funkce col() vytvoří seznam hodnot, které jsou v daném sloupci.

A můj problém je, že když dojde na moznosti[p].remove(m), odstraní se "m" z každého seznamu v "moznosti". Ja ale chci, aby se "m" odstranilo jen z jednoho (p-tého) seznamu v "moznosti". Tak, jak to je napsané teď se doplní vždy jen 1. číslo (v tomto případě 3) a zbytek zůstane jak je.

Snad jsem problém formuloval srozumitelně, předem děkuji za nápady.

Offline

  • (téma jako vyřešené označil(a) mountdoom)

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson