Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Testcases.
- Testcase101=[5 8 2 4 3 9 7 1 6;1 9 6 5 8 7 4 2 3;7 3 4 6 2 1 8 9 5;4 2 5 9 6 3 1 8 7;9 7 3 8 1 2 5 6 4;6 1 8 7 4 5 2 3 9;2 6 7 3 5 8 9 4 1;8 4 9 1 7 6 3 5 2;3 5 1 2 9 4 6 7 8];
- Testcase102=[1 6 9 7 2 4 5 8 3;4 7 3 5 8 6 9 1 2;5 2 8 1 9 3 6 7 4;2 1 5 4 0 9 3 6 8;8 9 7 3 6 1 2 4 5;6 3 4 8 5 2 7 9 1;3 8 6 9 4 5 1 2 7;9 0 1 2 3 7 8 5 6;7 5 2 6 1 8 4 3 9];
- Testcase103=[7 1 2 6 3 8 5 4 9;6 3 4 5 1 9 8 2 7;9 5 8 7 2 2 3 1 6;3 4 9 1 7 6 2 8 5;2 8 7 3 4 5 9 6 1;5 6 1 8 9 4 4 7 3;1 9 6 4 8 3 7 5 2;4 2 5 9 6 7 1 3 8;8 7 3 2 5 1 6 9 4];
- Testcase104=[5 9 6 4 8 2 5 7 3;8 5 4 7 6 3 9 2 1;2 7 3 1 9 1 4 6 8;3 4 7 6 2 8 1 9 5;5 2 9 3 1 7 6 8 4;6 1 8 9 4 5 7 3 2;4 3 2 1 7 9 8 5 6;7 6 5 8 3 4 2 1 9;9 8 1 2 5 6 3 4 7];
- Testcase105=[1 5 7 4 8 2 3 9 6;6 9 3 1 5 7 2 4 8;4 2 8 9 6 3 1 7 5;5 3 2 7 9 4 3 8 1;9 8 6 5 3 1 7 2 4;7 1 4 8 2 6 9 5 3;8 6 1 2 4 9 5 3 7;3 4 9 6 7 5 8 1 2;2 7 5 3 1 8 4 6 9];
- Testcase201=[6 4 7 9 1 2 8 5 3;5 8 2 7 4 3 6 9 1;3 1 0 0 0 0 0 7 4;9 6 1 3 2 4 7 8 5;8 5 4 6 9 7 3 1 2;7 2 3 5 8 1 4 6 9;2 3 8 1 7 9 5 4 6;4 9 6 2 5 8 1 3 7;1 7 5 4 3 6 9 2 8];
- Testcase202=[0 0 6 0 4 8 0 3 0;0 4 0 0 3 0 9 6 0;0 0 2 1 9 0 0 0 0;5 0 0 9 0 0 0 2 0;0 8 4 0 1 0 0 5 0;7 0 0 0 0 0 0 0 6;0 0 0 0 7 0 0 0 1;3 7 0 0 0 0 0 9 0;6 0 0 8 5 2 7 0 0];
- Testcase203=[0 0 6 0 2 0 0 0 0;0 0 0 0 0 9 0 1 0;4 2 0 6 0 0 8 5 7;0 0 3 2 4 0 1 0 0;0 0 0 0 1 0 0 6 5;0 7 1 0 0 0 0 9 0;8 0 0 0 0 0 0 2 0;7 3 0 0 8 0 9 0 0;6 0 0 5 0 4 0 0 0];
- Testcase204=[5 0 0 0 0 0 0 0 0;1 0 2 0 9 0 0 6 7;7 0 0 4 0 0 3 0 0;0 0 0 0 0 2 0 1 0;0 0 0 0 7 0 0 0 0;0 7 0 0 1 0 0 0 4;0 0 7 0 0 0 8 0 0;0 9 0 0 0 0 0 0 0;0 0 0 3 6 1 4 0 0];
- Testcase205=[0 1 9 0 0 3 0 0 0;5 7 6 0 0 0 0 3 0;0 0 3 0 0 6 9 0 2;1 0 0 9 6 2 8 7 0;6 0 0 7 0 5 1 0 3;8 9 0 0 0 0 0 0 0;9 0 0 8 0 0 0 0 0;0 5 8 0 0 0 0 0 0;0 4 0 0 3 0 0 0 5];
- Testcase206=[0 4 3 0 0 0 2 5 0;0 0 0 2 8 7 0 0 0;7 2 0 0 0 0 1 0 6;0 0 7 8 0 0 3 0 0;0 0 6 7 0 1 4 0 0;0 9 0 3 2 0 0 7 1;0 0 0 6 3 0 0 0 4;0 7 2 4 0 0 0 0 5;1 0 0 0 0 0 0 0 0];
- Testcase207=[2 0 0 0 6 0 8 9 1;0 8 0 0 0 0 0 0 0;7 9 6 0 0 5 3 0 0;6 0 0 8 2 7 0 0 0;0 0 9 0 4 3 2 0 6;0 0 0 9 0 0 0 0 8;0 2 0 0 9 1 0 8 0;4 6 0 0 0 0 5 0 0;0 0 8 4 0 2 1 0 7];
- Testcase208=[0 0 8 0 0 0 0 1 4;5 2 7 0 8 1 0 0 0;0 0 0 0 2 3 0 7 0;3 0 0 0 1 0 6 5 0;0 0 9 3 6 0 0 0 0;1 0 0 0 5 9 0 3 0;2 0 3 0 0 8 7 0 0;0 0 0 1 9 0 3 2 0;0 6 5 2 0 0 0 0 0];
- Testcase209=[0 6 0 7 9 0 0 0 3;2 0 0 0 0 0 9 0 0;4 0 0 6 5 3 0 8 0;0 0 0 0 1 0 5 7 8;1 0 5 3 0 0 6 4 0;9 0 7 0 6 5 0 0 2;0 0 0 9 0 0 0 0 1;0 0 0 5 0 4 0 0 0;0 9 0 0 8 6 0 5 0];
- Testcase210=[3 8 2 0 0 5 0 9 4;0 0 0 0 0 6 0 0 0;9 0 6 0 0 0 7 3 0;8 6 0 2 0 7 1 4 0;0 0 0 0 0 3 0 5 2;1 0 0 0 0 8 0 7 0;0 0 0 0 0 1 9 0 0;0 0 0 0 0 0 0 6 0;0 7 8 5 0 9 4 0 1];
- Testcase211=[0 0 1 7 0 0 0 3 0;0 7 0 0 8 1 0 0 0;0 0 0 0 6 9 0 0 7;0 0 0 0 4 0 0 8 0;9 6 7 0 1 0 0 5 0;4 0 8 0 5 2 0 0 0;8 0 5 0 3 4 7 9 6;7 1 6 0 0 0 2 4 3;0 9 4 0 0 0 8 0 0];
- Testcase212=[0 0 0 0 4 8 0 0 0;0 0 0 9 0 2 0 6 0;0 7 0 0 1 5 0 0 8;8 9 0 0 2 4 0 0 0;6 0 0 0 0 9 0 2 0;4 2 3 0 0 0 7 0 5;0 8 9 4 0 1 3 0 0;0 0 4 0 9 3 0 5 2;1 0 0 0 0 0 4 0 0];
- Testcase213=[7 0 4 0 0 0 0 9 6;5 0 8 9 0 0 7 0 1;0 0 0 0 8 7 0 0 0;8 9 0 6 0 0 2 0 0;2 0 3 0 7 9 6 1 0;6 0 0 0 2 8 0 3 4;0 6 0 8 0 0 0 7 5;1 0 7 3 0 0 0 0 0;3 8 9 0 0 0 0 0 0];
- Testcase214=[3 0 0 0 0 4 0 1 0;0 0 9 0 3 6 7 0 4;0 4 0 0 0 0 8 0 0;0 1 4 0 0 0 0 0 7;2 0 7 0 4 0 0 0 0;0 0 0 0 2 9 6 0 1;0 0 0 0 0 0 0 3 6;0 7 0 1 0 2 4 0 5;0 0 5 0 6 3 0 7 2];
- Testcase215=[0 0 0 0 4 0 2 0 6;0 0 0 0 0 0 0 9 0;6 0 2 5 0 3 0 0 0;5 4 0 0 0 0 1 7 0;0 0 0 0 0 9 0 4 0;0 1 0 0 7 0 0 8 3;4 0 0 0 3 1 0 5 0;7 0 0 0 0 0 0 0 8;0 8 0 0 0 0 4 6 0];
- function D=Duwplat(A)
- //Duwplat zorgt dat een matrix een vector wordt.
- D=[]
- //Gaat elke rij overlopen om deze dan allemaal achtereen te zetten.
- for i=1:size(A,1)
- D=[D(1,:),A(i,:)]
- end
- endfunction
- function G=alleCijfersAanwezig(A)
- //alleCijfersAanwezig gaat kijken of alle cijfers van 1 tot 9 er 1 maal inzitten
- D=Duwplat(A)
- l=length(D)
- G=%T
- Teller=1
- for t=1:l
- //Bekijkt alle cijfers in de vector tot deze gevonde is en zet deze dan op 0 en erna stopt met achter dit getal te zoeken.
- B=%T
- for i=1:l
- if D(i)==t & B then
- D(i)=0;
- B=%F;
- end
- end
- end
- for j=1:l
- //Gaat kijken of alle cijfers 0 zijn als dit niet zo is zal de uitkomst False zijn.
- if D(j)~=0 then
- G=%F
- end
- end
- endfunction
- function B=GoedeSudoku(A)
- //GoedeSudoku gaat testen of deze sudoku correct is.
- C=size(A,2) //aantal kolommen
- H=size(A,1) //aantal rijen
- if C==H then
- S=sqrt(C)
- else
- S=3
- end
- B=%T
- T=%T
- Rij=0
- Kol=0
- Seg=0
- while B & T
- //Lus 1 - Dit zal alle rijen nakijken of deze goed opgelost zijn.
- for i=1:H
- D=A(i,:)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Rij=(i)
- end
- end
- //Lus 2 - Dit zal alle kolommen nakijken of deze goed opgelost zijn.
- for i=1:C
- D=A(:,i)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Kol=(i)
- end
- end
- //Lus 3 - Dit zal alle Segmenten nakijken of deze goed opgelost zijn.
- SS=S-1
- for i=1:S:H-SS
- for j=1:S:C-SS
- D=A(i:i+SS,j:j+SS)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Seg=(floor((j-1)/S)+(floor((i-1)/S)*S)+1)
- end
- end
- end
- T=%F
- end
- if ~B&Rij>0 then
- printf("De eerste fout bevindt zich in Rij %d.\n",Rij)
- elseif ~B&Kol>0 then
- printf("De eerste fout bevindt zich in Kolom %d.\n",Kol)
- elseif ~B&Seg>0 then
- printf("De eerste fout bevindt zich in Segment %d.\n",Seg)
- elseif B then
- printf("Deze Sudoku is correct opgesteld.\n")
- end
- endfunction
- function TC=totaalOpenCijfers(A)
- //Deze functie gaat kijken hoeveel vakjes in de sudoku nog moeten opgelost worden.
- TC=0
- B=Duwplat(A)
- if GoedeSudoku(A) then
- //Gaat alle cijfers van B overlopen.
- for i=1:length(B)
- if B(i)==0 then
- TC=TC+1
- end
- end
- else
- printf("Deze sudoku is foutief opgesteld.\n")
- end
- printf("Er zijn %d lege vakjes.\n",TC)
- endfunction
- function B=isSudokuOpgelost(A)
- //isSudokuOpgelost gaat testen of deze sudoku correct is.
- C=size(A,2) //aantal kolommen
- H=size(A,1) //aantal rijen
- if C==H then
- S=sqrt(C)
- else
- S=3
- end
- B=%T
- T=%T
- Rij=0
- Kol=0
- Seg=0
- while B & T
- //Lus 1 - Dit zal alle rijen nakijken of deze goed opgelost zijn.
- for i=1:H
- D=A(i,:)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Rij=(i)
- end
- end
- //Lus 2 - Dit zal alle kolommen nakijken of deze goed opgelost zijn.
- for i=1:C
- D=A(:,i)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Kol=(i)
- end
- end
- //Lus 3 - Dit zal alle Segmenten nakijken of deze goed opgelost zijn.
- SS=S-1
- for i=1:S:H-SS
- for j=1:S:C-SS
- D=A(i:i+SS,j:j+SS)
- if ~alleCijfersAanwezig(D) & B then
- B=%F
- Seg=(floor((j-1)/S)+(floor((i-1)/S)*S)+1)
- end
- end
- end
- //Gaat kijken of alle vakjes ingevuld zijn.
- if totaalOpenCijfers(A)>0 then
- B=%F
- end
- T=%F
- end
- if ~B&Rij>0 then
- printf("De eerste fout bevindt zich in Rij %d.\n",Rij)
- elseif ~B&Kol>0 then
- printf("De eerste fout bevindt zich in Kolom %d.\n",Kol)
- elseif ~B&Seg>0 then
- printf("De eerste fout bevindt zich in Segment %d.\n",Seg)
- elseif ~B&Seg==0&Kol==0&Rij==0 then
- printf("Deze sudoku is nog niet volledig opgelost.\n")
- elseif B then
- printf("Deze Sudoku is correct opgelost. Proficiat!\n")
- end
- endfunction
- function V=ontbrekendeCijfers(A)
- //Deze functie gaat nakijken in een "matrix" of alle opeenvolgende cijfers aanwezig zijn en welke dan niet aanwezig zijn.
- B=Duwplat(A)
- Dubbels=~alleCijfersAanwezig(B)
- V=[]
- l=length(B)
- teller=1
- if Dubbels then
- error("De vector is foutief")
- else
- for t=1:l
- g=%F
- i=1
- for i=1:l
- if B(i)==t & ~g then
- g=%T
- end
- end
- if ~g then
- V(1,teller)=t
- teller=teller+1
- end
- end
- end
- endfunction
- function U=uniekOntbrekende(R,K,S)
- //kijkt na welk uniek cijfer er ontbreekt in de 3 vectoren
- A=Duwplat(R)
- B=Duwplat(K)
- C=Duwplat(S)
- U=0
- RO=ontbrekendeCijfers(R)
- KO=ontbrekendeCijfers(K)
- SO=ontbrekendeCijfers(S)
- tel=0
- if alleCijfersAanwezig(R) & alleCijfersAanwezig(K) & alleCijfersAanwezig(S) then
- for i=1:length(RO)
- for j=1:length(KO)
- for k=1:length(SO)
- if RO(i)==KO(j) & KO(j)==SO(k) then
- U=RO(i)
- tel=tel+1
- end
- end
- end
- end
- end
- if tel>1 then
- U=0
- end
- endfunction
- function S=luiePoging(B)
- //Gaat de hele sudoku doorlopen en kijken of er een onbekend cijfer zijn die ingevuld kunnen worden. De sudoku wordt maar 1 maal doorlopen.
- h=size(B,1)
- b=size(B,2)
- if h==b then
- sd=sqrt(h)
- else
- sd=3
- end
- cijf=0
- S=(B(:,:))
- G=GoedeSudoku(B)
- O=isSudokuOpgelost(B)
- if G & ~O
- for i=1:h
- for j=1:b
- if S(i,j)==0 then
- //Worden Rijen geselecteerd.
- RT=S(i,:)
- //Worden Kolommen geselecteerd.
- KT=S(:,j)
- //Worden Segmenten geselecteerd.
- r=(floor((i-1)/sd)*sd)+1
- k=(floor((j-1)/sd)*sd)+1
- ST=S(r:r+sd-1,k:k+sd-1)
- cijf=uniekOntbrekende(RT,KT,ST)
- S(i,j)=cijf
- //Print het cijfer uit dat is ingevuld en de locatie.
- if cijf~=0 then
- printf("Het cijfer %d werd ingevuld in het vakje (%d,%d).\n",cijf,i,j)
- end
- end
- end
- end
- end
- O=isSudokuOpgelost(S)
- if ~O then
- printf("Deze sudoku is nog niet volledig opgelost.\n")
- end
- endfunction
- function S=BlijvenProberen(B)
- //gaat de sudoku proberen op te lossen door de luiepoging te herhalen.
- h=size(B,1)
- b=size(B,2)
- if h==b then
- sd=sqrt(h)
- else
- sd=3
- end
- cijf=0
- S=(B(:,:))
- G=GoedeSudoku(S)
- O=isSudokuOpgelost(S)
- teller=1
- while G & ~O & teller>0
- teller=0
- for i=1:h
- for j=1:b
- if S(i,j)==0 then
- //Worden Rijen geselecteerd.
- RT=S(i,:)
- //Worden Kolommen geselecteerd.
- KT=S(:,j)
- //Worden Segmenten geselecteerd.
- r=(floor((i-1)/sd)*sd)+1
- k=(floor((j-1)/sd)*sd)+1
- ST=S(r:r+sd-1,k:k+sd-1)
- cijf=uniekOntbrekende(RT,KT,ST)
- S(i,j)=cijf
- //Print het cijfer uit dat is ingevuld en de locatie.
- if cijf~=0 then
- printf("Het cijfer %d werd ingevuld in het vakje (%d,%d).\n",cijf,i,j)
- teller=teller+1
- end
- end
- end
- end
- end
- endfunction
- function S=zoekUniekVakje(M)
- //Deze functie gaat 5 functies gebruiken om een sudoku proberen op te lossen.
- OC=1
- S=M(:,:)
- OS=isSudokuOpgelost(S)
- while OC>0&~OS
- //Wanneer geen cijfer meer ingevuld wordt zal deze lus ophouden.
- //Hier staan de 4 functies van de 5 die gebruikt worden: BlijvenProberen, RijenInvullen, KolommenInvullen en SegmentenInvullen.
- //Deze gaan de meeste sudokus oplossen.
- OC=totaalOpenCijfers(S)
- S=BlijvenProberen(S)
- S=RijenInvullen(S)
- S=KolommenInvullen(S)
- S=SegmentenInvullen(S)
- OS=isSudokuOpgelost(S)
- OC=OC-totaalOpenCijfers(S)
- end
- //Hier zal de methode BackTracking gestart worden wanneer alle voorgaande onsuccesvol zijn.
- //Deze methode werkt volgens het principe van BackTracking.
- //Deze methode maakt het makkelijker om elke sudoku proberen op te lossen zonder teveel methodes te moeten gebruiken.
- if ~OS then
- S=BackTracking(S)
- OS=isSudokuOpgelost(S)
- end
- if ~OS then
- printf("Sorry het programma krijgt deze sudoku niet opgelost.")
- end
- endfunction
- function S=RijenInvullen(M)
- //Deze functie gaat de rijen invullen door te kijken of er maar 1 mogelijke positie is voor elk cijfer in deze rij.
- HM=size(M,1)
- BM=size(M,2)
- OS=isSudokuOpgelost(M)
- S=M(:,:)
- if HM==BM then
- sd=sqrt(HM)
- else
- sd=3
- end
- if ~OS then
- //Alle rijen overlopen.
- for i=1:HM
- OCDM=ontbrekendeCijfers(S(i,:))
- //Alle cijfers overlopen.
- for j=1:BM
- T=%F
- for k=1:length(OCDM)
- //Gaat kijken of het cijfer bij de ontbrekende cijfers zit.
- if OCDM(k)==j then
- T=%T
- end
- end
- if T then
- for k=1:BM
- if S(i,k)==0 then
- S(i,k)=j
- end
- end
- for k=1:BM
- if ~alleCijfersAanwezig(S(:,k)) then
- S(i,k)=0
- end
- end
- H=1
- if i<7&i>3 then
- H=4
- elseif i>6 then
- H=7
- end
- for k=1:sd:BM-sd+1
- SS=S(H:H+sd-1,k:k+sd-1)
- sstel=0
- for l=1:sd
- TSS=%T
- for m=1:sd
- if TSS&SS(l,m)==j then
- sstel=sstel+1
- TSS=%F
- end
- end
- end
- if ~alleCijfersAanwezig(SS)&sstel>1 then
- for l=0:sd-1
- if S(i,k+l)==j then
- S(i,k+l)=0
- end
- end
- end
- end
- if ~alleCijfersAanwezig(S(i,:)) then
- for k=1:BM
- if S(i,k)==j then
- S(i,k)=0
- end
- end
- end
- for k=1:BM
- if S(i,k)==j then
- printf("Het cijfer %d werd ingevuld in het vakje (%d,%d).\n",j,i,k)
- end
- end
- end
- end
- end
- end
- endfunction
- function S=KolommenInvullen(M)
- //Deze functie gaat de kolommen invullen door te kijken of er maar 1 mogelijke positie is voor elk cijfer in deze kolommen.
- HM=size(M,1)
- BM=size(M,2)
- OS=isSudokuOpgelost(M)
- S=M(:,:)
- if HM==BM then
- sd=sqrt(HM)
- else
- sd=3
- end
- if ~OS then
- //Alle kolommen overlopen.
- for i=1:BM
- OCDM=ontbrekendeCijfers(S(:,i))
- //Alle cijfers overlopen.
- for j=1:HM
- T=%F
- for k=1:length(OCDM)
- //Gaat kijken of het cijfer bij de ontbrekende cijfers zit.
- if OCDM(k)==j then
- T=%T
- end
- end
- if T then
- //Alle nullen in de kolom invullen met het cijfer dat ontbreekt en nu getest wordt (het cijfer j).
- for k=1:HM
- if S(k,i)==0 then
- S(k,i)=j
- end
- end
- //Kijken of alle overeenkomstige rijen nog correct zijn. Indien niet hebben we een cijfer ingevuld op een plaats waar het onmogelijk kan staan en zetten we dit terug op 0.
- for k=1:BM
- if ~alleCijfersAanwezig(S(k,:)) then
- S(k,i)=0
- end
- end
- H=1
- if i<7&i>3 then
- H=4
- elseif i>6 then
- H=7
- end
- for k=1:sd:HM-sd+1
- SS=S(k:k+sd-1,H:H+sd-1)
- sstel=0
- for l=1:sd
- TSS=%T
- for m=1:sd
- if TSS&SS(m,l)==j then
- sstel=sstel+1
- TSS=%F
- end
- end
- end
- if ~alleCijfersAanwezig(SS)&sstel>1 then
- for l=0:sd-1
- if S(k+l,i)==j then
- S(k+l,i)=0
- end
- end
- end
- end
- if ~alleCijfersAanwezig(S(:,i)) then
- for k=1:HM
- if S(k,i)==j then
- S(k,i)=0
- end
- end
- end
- for k=1:BM
- if S(k,i)==j then
- printf("Het cijfer %d werd ingevuld in het vakje (%d,%d).\n",j,i,k)
- end
- end
- end
- end
- end
- end
- endfunction
- function S=SegmentenInvullen(M)
- HM=size(M,1)
- BM=size(M,2)
- OS=isSudokuOpgelost(M)
- S=M(:,:)
- if HM==BM then
- sd=sqrt(HM)
- else
- sd=3
- end
- if ~OS then
- //Alle Segmenten overlopen
- for i=1:sd:HM-sd+1
- for j=1:sd:BM-sd+1
- OCDM=ontbrekendeCijfers(S(i:i+sd-1,j:j+sd-1))
- //Alle cijfers overlopen
- for k=1:BM
- T=%F
- for l=1:length(OCDM)
- if OCDM(l)==k then
- T=%T
- end
- end
- if T then
- for m=0:sd-1
- for n=0:sd-1
- if S(i+m,j+n)==0 then
- S(i+m,j+n)=k
- end
- end
- end
- for m=0:sd-1
- if ~alleCijfersAanwezig(S(i+m,:)) then
- teller=0
- for n=1:HM
- if S(i+m,n)==k then
- teller=teller+1
- end
- end
- for n=0:sd-1
- if S(i+m,j+n)==k then
- teller=teller-1
- end
- end
- if teller>0 then
- for n=0:sd-1
- if S(i+m,j+n)==k then
- S(i+m,j+n)=0
- end
- end
- end
- end
- end
- for n=0:sd-1
- if ~alleCijfersAanwezig(S(:,j+n)) then
- teller=0
- for m=1:BM
- if S(m,j+n)==k then
- teller=teller+1
- end
- end
- for m=0:sd-1
- if S(i+m,j+n)==k then
- teller=teller-1
- end
- end
- if teller>0 then
- for m=0:sd-1
- if S(i+m,j+n)==k then
- S(i+m,j+n)=0
- end
- end
- end
- end
- end
- if ~alleCijfersAanwezig(S(i:i+sd-1,j:j+sd-1)) then
- for m=0:sd-1
- for n=0:sd-1
- if S(i+m,j+n)==k then
- S(i+m,j+n)=0
- end
- end
- end
- end
- for m=0:sd-1
- for n=0:sd-1
- if S(i+m,j+n)==k then
- printf("Het cijfer %d werd ingevuld in het vakje (%d,%d).\n",k,i+m,j+n)
- end
- end
- end
- end
- end
- end
- end
- end
- endfunction
- function S=BackTracking(M)
- Cijf=0
- S=M(:,:)
- BR=0
- HO=0
- HM=size(M,1)
- BM=size(M,2)
- if HM==BM then
- sd=sqrt(HM)
- else
- sd=3
- end
- OS=isSudokuOpgelost(M)
- if ~OS
- for v=1:sd:HM-sd+1
- for w=1:sd:BM-sd+1
- OCDS=ontbrekendeCijfers(M(v:v+sd-1,w:w+sd-1))
- rij=v
- kol=w
- LOCDS=length(OCDS)
- while ~OS&OCDS~=zeros(1,LOCDS)
- R=M(:,:)
- T=%T
- for i=1:length(OCDS)
- if T&OCDS(i)>0 then
- Cijf=OCDS(i)
- OCDS(i)=0
- T=%F
- end
- end
- T=%T
- for i=0:sd-1
- for j=0:sd-1
- if T&R(v+i,w+j)==0 then
- R(v+i,w+j)=Cijf
- BR=w+j
- HO=v+i
- T=%F
- printf("Het Random cijfer %d werd ingevuld in het vakje (%d,%d).\n",Cijf,HO,BR)
- end
- end
- end
- VC=1
- TR=alleCijfersAanwezig(R(HO,:))
- if TR then
- TR=alleCijfersAanwezig(R(:,BR))
- end
- while ~OS&VC>0&TR
- VC=totaalOpenCijfers(R)
- R=BlijvenProberen(R)
- R=RijenInvullen(R)
- R=KolommenInvullen(R)
- R=SegmentenInvullen(R)
- VC=VC-totaalOpenCijfers(R)
- end
- OS=isSudokuOpgelost(R)
- LOCDS=LOCDS-1
- if ~OS then
- printf("Het Random cijfer %d is een slechte oplossing.\n",Cijf)
- elseif OS then
- printf("Het cijfer %d in het vakje (%d,%d) is een goede oplossing.\n",Cijf,HO,BR)
- end
- end
- end
- end
- end
- if OS then
- S=R(:,:)
- end
- endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement