|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.02.2010, 18:48 | #1 |
Новичок
Джуниор
Регистрация: 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. помогите пожалуйста, кто чем может. |
14.02.2010, 18:53 | #2 |
Босс
Форумчанин
Регистрация: 03.06.2009
Сообщений: 125
|
Есть готовая программа!!! 255507394
Две одинаковые вложенные ошибки называются четной ошибкой и ошибкой не являются. Ася 255507394. Отзывы здесь. |
15.02.2010, 09:37 | #3 |
Пользователь
Регистрация: 02.10.2008
Сообщений: 14
|
Есть готовый рекурсивный алгоритм решения задачи. Программа + исходники по приемлемой цене. 25523четыре3 стучись
|
15.02.2010, 19:18 | #4 |
работаю за еду
Пользователь
Регистрация: 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 с каждой стороны?
Вотан ждёт меня в своих чертогах, на свой вечный пир!
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Алгоритм решения судоку | 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 |