Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 18:48   #1
pchol
Новичок
Джуниор
 
Регистрация: 14.02.2010
Сообщений: 0
По умолчанию алгоритм решения судоку на паскале.

всем привет.
у меня возникла маленькая проблема при написании курсовой, программа решения судоку. я не могу найти ошибку. у меня пишет "выход за границы диапазона изменения индекса 1..9" и я не могу исправить эту ошибку. вот код программы:

uses
CRT;

const
N=9;
M=3;

type
tCell=0..N;
tBoard=array[1..N,1..N] of tCell;
tList=set of tCell;
sudoku=class
Board:tBoard;
List:tList;
a,b,c,i,j,k,l, Total:byte;
Ok,Done:boolean;
constructor Create(Board1:tBoard; List1:tList; a1,b1,c1,i1,j1,k1,l1, Total1:byte; Ok1,Done1:boolean);
procedure ShowBoard(k,l:tCell);
var
i,j,Bac:integer;
begin
for i:=0 to N+1 do begin
for j:=0 to N+1 do begin
if i*j*(i-N-1)*(j-N-1)=0 then begin
TextBackGround(7);Write(' ')
end
else begin
if Odd(Pred(i) div M+Pred(j) div M) then Bac:=1 else Bac:=9;
TextColor(15);TextBackGround(Bac);
if Board[i,j]=0 then Write(' ') else begin
Write(' ');
if (i=k)and(j=l) then begin
TextColor(0);TextBackGround(14);Wri te(Board[i,j]);
end
else Write(Board[i,j])
end
end
end;
TextBackGround(15);
WriteLn
end;
WriteLn;
If ReadKey=#27 then Halt
end;

procedure FillList(Cell:tCell);
begin
if not (Cell in List) then begin
List:=List+[Cell];
Inc(Total);
if Total=9 then begin
WriteLn('No way! ',i,' ',j);
end
end
end;
procedure ReadBoard(Name:string);
var
s:string;
f:text;
begin
Assign(f,Name);ReSet(f);
for i:=1 to N do begin
ReadLn(f,s);
for j:=1 to N do if j<=Length(s) then case s[j] of
'0'..'9':Board[i,j]:=Byte(s[j])-48;
else Board[i,j]:=0
end
else Board[i,j]:=0
end;
Close(f)
end;
end;

constructor sudoku.Create(Board1:tBoard; List1:tList; a1,b1,c1,i1,j1,k1,l1, Total1:byte; Ok1,Done1:boolean);
begin
Board:=Board1;
List:=List1;
a:=a1;
b:=b1;
c:=c1;
i:=i1;
j:=j1;
k:=k1;
l:=l1;
Total:=Total1;
Ok:=Ok1;
Done:=Done1;
end;

var s:sudoku;
Board:tBoard;
List:tList;
a,b,c,i,j,k,l, Total:byte;
Ok,Done:boolean;
begin
s:=sudoku.Create;
s.ReadBoard('sudoku.dat');
s.ShowBoard(0,0);
repeat
Ok:=false;
Done:=true;
for i:=1 to N do for j:=1 to N do if Board[i,j]=0 then begin
Done:=false;
a:=Pred(i) div M*M;
b:=Pred(j) div M*M;
Total:=0;
List:=[0];
for k:=1 to N do begin
s.FillList(Board[k,j]);
s.FillList(Board[i,k]);
end;
for k:=Succ(a) to a+M do for l:=Succ(b) to b+M do s.FillList(Board[k,l]);
if Total=8 then begin
c:=1;
while c in List do Inc(c);
Board[i,j]:=c;
Ok:=true;
s.ShowBoard(i,j)
end
end;
if Done then WriteLn('Done!')
until not Ok or Done;
if not Done then WriteLn('Multiple choce')
end.

помогите пожалуйста, кто чем может.
pchol вне форума Ответить с цитированием
Старый 14.02.2010, 18:53   #2
sheka
Босс
Форумчанин
 
Аватар для sheka
 
Регистрация: 03.06.2009
Сообщений: 125
По умолчанию

Есть готовая программа!!! 255507394

Две одинаковые вложенные ошибки называются четной ошибкой и ошибкой не являются.
Ася 255507394. Отзывы здесь.
sheka вне форума Ответить с цитированием
Старый 15.02.2010, 09:37   #3
Loky
Пользователь
 
Регистрация: 02.10.2008
Сообщений: 14
По умолчанию

Есть готовый рекурсивный алгоритм решения задачи. Программа + исходники по приемлемой цене. 25523четыре3 стучись
Loky вне форума Ответить с цитированием
Старый 15.02.2010, 19:18   #4
maxflint
работаю за еду
Пользователь
 
Аватар для maxflint
 
Регистрация: 31.10.2009
Сообщений: 64
По умолчанию

Друг... тебе это не кажется странным?

tBoard=array[1..N,1..N] of tCell;

.....

for i:=0 to N+1 do begin
for j:=0 to N+1 do begin
.......
if Board[i,j]=0 then Write(' ')


Board массив у тебя индексы в типе имеют такой диапазон 1..N,1..N, а цикл ты крутишь по +1 с каждой стороны?
Вотан ждёт меня в своих чертогах, на свой вечный пир!
maxflint вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм решения судоку Alistan Общие вопросы C/C++ 5 27.04.2011 16:00
Алгоритм решения Naruto63 Помощь студентам 6 20.09.2009 22:47
Алгоритм решения квадратного неравенства? StakanpORTvejna Паскаль, Turbo Pascal, PascalABC.NET 8 28.04.2009 16:37
Подскажите алгоритм решения Blad47 Паскаль, Turbo Pascal, PascalABC.NET 1 10.11.2008 19:50
Метод перебора для нахождения решения "Судоку" ДЖО Помощь студентам 23 04.06.2008 22:29