You are not logged in.

- Topics: Active | Unanswered

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

hi guys

i am trying to make a program to solve a Sudoku.i hope you know what that is.

now i have finished the code but there seems to be a logical error because i entered a valid one and it outputted the message 'The Sudoku cannot be solved!!!'

here's the code:

```
program Sudoku_solver;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
{$IFDEF WINDOWS}{$R Sudoku.rc}{$ENDIF}
const
max=9;
type
niz=array[1..max] of integer;
matrica=array[1..max] of niz;
var
a:matrica;
i,j:integer;
ok:boolean;
function row(a:matrica;i1,j1:integer):boolean;
var
j:integer;
b:boolean;
begin
b:=true;
for j:=1 to 9 do
if j<>j1 then
if a[i1][j]=a[i1][j1] then
b:=false;
red:=b;
end;
function column(a:matrica;i1,j1:integer):boolean;
var
i:integer;
b:boolean;
begin
b:=true;
for i:=1 to 9 do
if i<>i1 then
if a[i][j1]=a[i1][j1] then
b:=false;
vrsta:=b;
end;
function square(a:matrica;i1,j1:integer):boolean;
var
i,j,k,l:integer;
b:boolean;
begin
b:=true;
case i1 of
1,2,3: begin
k:=0;
i:=3
end;
4,5,6: begin
k:=3;
i:=6;
end;
7,8,9: begin
k:=6;
i:=9;
end;
end;
case j1 of
1,2,3: begin
l:=0;
j:=3
end;
4,5,6: begin
l:=3;
j:=6;
end;
7,8,9: begin
l:=6;
j:=9;
end;
end;
while (k<=i) do
begin
k:=k+1;
while (l<=j) do
begin
l:=l+1;
if (k<>i1) and (l<>j1) then
if a[k][l]=a[i1][j1] then
b:=false;
end;
end;
kvadrat:=b;
end;
function pos(a:matrica;i,j:integer):boolean;
begin
poz:=row(a,i,j) and column(a,i,j) and square(a,i,j);
end;
procedure sudoku(var a:matrica;n,i1,j1:integer;ok:boolean);
var
i,j,k:integer;
b:boolean;
begin
i:=i1;
j:=j1;
a[i][j]:=n;
ok:=false;
b:=true;
if poz(a,i,j) then
begin
ok:=true;
i:=0;
j:=0;
while (b=true) and (i<=max) do
begin
i:=i+1;
while (b=true) and (j<=max) do
begin
j:=j+1;
if a[i][j]=0 then
b:=false;
end;
end;
if b=false then
begin
k:=0;
ok:=false;
while (k<=9) and not ok do
begin
k:=k+1;
sudoku(a,k,i,j,ok);
end;
end;
end;
end;
begin
writeln('Enter the Sudoku: ');
for i:=1 to 9 do
begin
for j:=1 to 9 do
read(a[i][j]);
readln;
end;
k:=0;
ok:=false;
while (k<=9) and not ok do
begin
k:=k+1;
sudoku(a,k,i,j,ok);
end;
if ok then
begin
writeln('The solution is: ')
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(a[i][j]);
writeln;
end;
end
else writeln('Sudoku cannot be solved!!!');
readln;
end.
```

note that functions row,column and square check if there are same numbers as the number we are looking at in the same row,column and square.

my second question is: is there another (better) way to make the Sudoku solver,because this one is fairly long and complex !?

*Last edited by anonimnystefy (2011-09-30 09:14:47)*

Here lies the reader who will never open this book. He is forever dead.

Taking a new step, uttering a new word, is what people fear most. ― Fyodor Dostoyevsky, Crime and Punishment

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Hi anonimnystefy;

That is not long at all for a sudoku solver. What is the sudoku problem that you are

testing this on?

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

hi bobbym

it's:

0 4 7 0 0 0 3 0 0

8 0 6 0 7 4 0 0 0

0 0 0 2 0 3 8 4 0

0 7 0 0 0 0 4 0 3

9 0 0 4 0 8 0 0 2

4 0 3 0 0 0 0 9 0

0 2 8 6 0 1 0 0 0

0 0 0 8 2 0 7 0 9

0 0 9 0 0 0 2 1 8

the answer should be:

2 4 7 1 8 9 3 5 6

8 3 6 5 7 4 9 2 1

5 9 1 2 6 3 8 4 7

1 7 2 9 5 6 4 8 3

9 6 5 4 3 8 1 7 2

4 8 3 7 1 2 6 9 5

7 2 8 6 9 1 5 3 4

3 1 4 8 2 5 7 6 9

6 5 9 3 4 7 2 1 8

Here lies the reader who will never open this book. He is forever dead.

Taking a new step, uttering a new word, is what people fear most. ― Fyodor Dostoyevsky, Crime and Punishment

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

just for practice:

*Last edited by anonimnystefy (2011-09-29 08:13:23)*

Here lies the reader who will never open this book. He is forever dead.

Taking a new step, uttering a new word, is what people fear most. ― Fyodor Dostoyevsky, Crime and Punishment

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Funny thing is my program does noot get that one either.

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

but why won't it work?

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Hi;

I do not know. I checked the rows and columns of the solution as well as

every 3 x 3 grid. It should have got that answer?!

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

have you checked it compleely.it uses recursion.

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Hi anonimnystefy;

No, I haven't. I am looking at mine as to why it does not get that answer.

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

what does it get?

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Spits it out as if it does not have a solution! Where does that solution come from?

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

from me!

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

That is what I was thinking. Did you try it on any others?

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

nope! :embarrassed!

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

I can give you some examples if you do not have any.

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

i have bunch of them and i tried this one:

0 5 6 0 8 0 0 1 0

8 3 0 2 0 7 0 0 0

0 1 2 0 0 0 0 0 0

0 0 0 6 0 0 7 0 9

0 0 0 1 0 4 0 0 0

2 0 3 0 0 8 0 0 0

0 0 0 0 0 0 3 9 0

0 0 0 4 0 9 0 2 6

0 7 0 0 5 0 1 4 0

it won't work!

Here lies the reader who will never open this book. He is forever dead.

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

hi bobbym

i found an error on my side in the main code and i fixed it and i edited it but it still won't do it!

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Hi;

Something must be wrong with yours.

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

ya think?

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

That is about all I can do. I do not speak Java. Even my C++ is too rusty. Use your debugger to go line by line watching the variables as you go.

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

where did you get Java?

i'm using Pascal.very basic.

i changed my code a bit and got a program that solves only the first row.it won't go to the next one!

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Hi anonimnystefy;

Forgive my sense of humor, I know, you told me you were using Lazarus.

In the other thread, just out of curiosity, I asked if lazarus has a debugger? Does it?

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

think so.

Here lies the reader who will never open this book. He is forever dead.

**Online**

**bobbym****Administrator**- From: Bumpkinland
- Registered: 2009-04-12
- Posts: 90,886

Does it have a variable pane? Or a variable watch?

**In mathematics, you don't understand things. You just get used to them.**

**Online**

**anonimnystefy****Real Member**- From: The Foundation
- Registered: 2011-05-23
- Posts: 15,673

yes,yes it does.

Here lies the reader who will never open this book. He is forever dead.

**Online**