Пример #1
0
def sudoku_demo(s,testi,primeri):
    # s=4 ali 9: določa ali želimo reševati 9x9 ali 4x4 sudoku
    print('Ta program resuje {0}x{0} sudoku.'.format(s))
    
    # ponavljamo dokler uporabnik ne vpiše nekaj kar ni y/n
    while True:
        odlocitev=input('Ali zelis vpisati svoj sudoku? (y/n)  ')
        
        if odlocitev=='y' or odlocitev=='n':
            
            def risanje(s,resitev,besedilo=''):
                window=Tk()
                if s==4:
                    canvas=Canvas(window, width=280, height=300)
                if s==9:
                    canvas=Canvas(window, width=580, height=600)
                canvas.pack()
                # besedilo na vrhu okenčka
                canvas.create_text(120,17,text=besedilo,font=('Arial',18))
                if s==4:
                    # vse ravne črte na platnu
                    canvas.create_rectangle(20,40,260,280, width=3)
                    canvas.create_line(140,40,140,280, width=3)
                    canvas.create_line(20,160,260,160, width=3)
                    for i in range(2):   
                        canvas.create_line(80+i*120,40,80+i*120,280)
                        canvas.create_line(20,100+i*120,260,100+i*120)
                if s==9:
                    # vse ravne črte na platnu
                    canvas.create_rectangle(20,40,560,580, width=3)
                    for i in [0,1,3,4,6,7]:
                        canvas.create_line(80+i*60,40,80+i*60,580)
                        canvas.create_line(20,100+i*60,560,100+i*60)
                    for j in range(2):
                        canvas.create_line(200+j*180,40,200+j*180,580, width=3)
                        canvas.create_line(20,220+j*180,560,220+j*180, width=3)
                # vstavimo cifre v narisana polja
                for i in resitev.keys():
                    canvas.create_text(50+(i[1]-1)*60,70+(i[0]-1)*60,text='{0}'.format(i[2]),font=('Arial',30))  
                window.mainloop()
                
            # če uporabnik ne želi vpisati svojega sudokuja, mu program rešu sudoku iz datoteke Implementacija/sudoku4.txt
            if odlocitev=='n':
                if s==4:
                    f=open('Prevedbe_problemov/sudoku4.txt','r')
                if s==9:
                    f=open('Prevedbe_problemov/sudoku9.txt','r')
                f=f.readlines()
                # naredimo slovar 'narisi', s katerim narišemo sudoku, ki ga rešujemo in seznam 'seznam', tj. seznam znanih spremenljivk, ki jih vstavimo v program sudoku
                narisi={}
                seznam=[]
                for i in range(len(f)):
                    for j in range(0,2*s-1,2):
                        if f[i][j]!='0':
                            seznam.append((i+1,j//2+1,int(f[i][j])))
                            narisi[(i+1,j//2+1,int(f[i][j]))]=True
                risanje(s,narisi,'Rešujemo sudoku:')
                
            # če vpiše svoj sudoku ali želi rešitev dveh posebnih primerov zgoraj:
            if odlocitev=='y':
                if s==4:
                    print ('Sudoku naj bo oblike "1 2 0 0,0 3 4 0,...", kjer 0 pomeni, da je polje prazno.')
                if s==9:
                    print ('Sudoku naj bo oblike "1 2 0 0 0 0 0 0 0,0 0 0 3 4 0 0 0 0,...", kjer 0 pomeni, da je polje prazno.')
                sud=input('Vpisi svoj sudoku:  \n')
                if sud[:-1]=='test':
                        sud=testi[int(sud[-1])]
                if sud[:-1]=='primer':
                        sud=primeri[int(sud[-1])]
                sud=sud.split(',')
                narisi={}
                seznam=[]
                for i in range(len(sud)):
                    for j in range(0,2*s-1,2):
                        if sud[i][j]!='0':
                            seznam.append((i+1,j//2+1,int(sud[i][j])))
                            narisi[(i+1,j//2+1,int(sud[i][j]))]=True
                risanje(s,narisi,'Rešujemo sudoku:')
                
            # rešimo sudoku in vrnemo 'Ni rešitve' če ni rešljiv, oz. narišemo rešitev, če je rešljiv
            t1=time.clock()
            if s==4:
                resitev=dpll.dpll(sudoku4x4.sudoku4(seznam))
            if s==9:
                resitev=dpll.dpll(sudoku9x9.sudoku9(seznam))
            t2=time.clock() 

            if resitev[0]=='Ni rešitve':
                print ('Ta sudoku ni rešljiv. \n')
            
            else:
                for i in resitev[1].copy():
                    if resitev[1][i]==False:
                        del resitev[1][i]
                print('Tvoj sudoku sem reševal {0} sekund. \n'.format(t2-t1))
                risanje(s,resitev[1],'Rešen sudoku:')
            
        else:
            break       
def bedno_barvanje(V,E,k,risi=0):
    
    # risanje
    def risanje(resitev,V,E,k):
        window=Tk()
        canvas=Canvas(window, width=50*V+20, height=50*V+20)
        canvas.configure(background="white")
        canvas.pack()
        xkoord=list(range(20,50*V,40))
        ykoord=[(50*V+20)/2]*V
        for i in range(0,len(ykoord),2):
            ykoord[i]+=(50*randint(0,V)+20)/3
        for i in range(1,len(ykoord),2):
            ykoord[i]-=(50*randint(0,V)+20)/3
        koordinate=[]
        for i in range(V):
            koordinate.append([i+1,[xkoord[i],ykoord[i]]])
        for (i,j) in E:
            koord=koordinate[:]
            x,y,u,v,a=koord[i-1][1][0],koord[i-1][1][1],koord[j-1][1][0],koord[j-1][1][1],5
            if x<u: x,u=x+a,u-a
            if x>u: x,u=x-a,u+a
            if y<v: y,v=y+a,v-a
            if y>v: y,v=y-a,v+a
            canvas.create_line(x,y,u,v,width=2)
        barve=[sample(range(0,255,40),3) for i in range(k)]
        for i in koordinate[:]:
            for (j,k) in list(resitev.keys()):
                if i[0]==j:
                    b=10
                    canvas.create_oval(i[1][0]-b,i[1][1]-b,i[1][0]+b,i[1][1]+b,fill='#%02x%02x%02x' % (barve[k-1][0],barve[k-1][1],barve[k-1][2]))
                    canvas.create_text(i[1][0],i[1][1],text='{0}'.format(i[0]),font=('Arial',12))
                    koordinate.remove(i)
        for i in koordinate:
            canvas.create_text(i[1][0],i[1][1],text='{0}'.format(i[0]),font=('Arial',14,'bold'))
        window.mainloop()

    #rešimo problem barvanja
    t1=time.clock()
    resitev = dpll.dpll(barvanje_grafov.barvanje_grafov(V,E,k))
    t2=time.clock()

    if resitev[0]=='Ni rešitve':
        print('  Ta graf ni {0} obarljiv. \n'.format(k))
        
    else:
        print('  Ta graf je {0} obarljiv.'.format(k))
        for i in resitev[1].copy():
            if resitev[1][i]==False:
                del resitev[1][i]
        izpis=[[] for i in range(k)]
        for (i,j) in list(resitev[1].keys()):
            izpis[j-1].append(i)
            izpis[j-1].sort()
        izpis.sort()
        for i in izpis[:]:
            if i==[]: izpis.remove(i)
        for i in range(len(izpis)):
            print ('  Vozlišča {0} so pobarvana s/z {1}. barvo.'.format(izpis[i],i+1))

        if risi==1:
            risanje(resitev[1],V,E,k)             
        print ('  Tvoj graf sem barval {0} sekund. \n'.format(t2-t1))