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))