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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2010, 13:54   #1
valli
 
Регистрация: 19.07.2010
Сообщений: 3
Вопрос программа судоку

Здравствуйте!посоветуйте,что можно исправить в программе,чтобы она правильно выполняла программу Судоку.Потому что после загрузки окна программы,я могу только ввести 9 строк(состоящих из цифр или букв),потом происходит возвращение к окну редактора. и я считаю,что программа не похожа на популярную игру судоку.
Код:
program sudoku;
 const
 maxsol=100;
 type
 tcell=record
 nv:longint;
 v:array [1..9] of longint;
 end;
 tfield=array[0..80] of tcell;
 var
 field:tfield;
 vars9,vars0:tcell;
 i,j,nsol:longint;
 ch:char;
 flg:boolean;
 procedure print_ans;
var
 i,j,k:longint;
 begin
 for i:=0 to 8 do
 begin
 for j:=0 to 8 do
 with field[i*9+j] do
 if nv>1 then
 write('0')
 else for k:=1 to 9 do
 if v[k]=0 then begin
 write(k);
 break;
 end;
 writeln;
 end;
 writeln;
 end;
 procedure rem_cell(x,y,vv:longint);
 begin
 with field[y*9+x] do begin
 inc(v[vv]);
 if v[vv]=1 then begin
 dec(nv);
 if nv=0 then
 flg:=true
 end;
 end;
 end;
 procedure rem_cells(n,vv:longint);
 var
 x,y,xx,yy,i,j:longint;
 begin
 x:=n mod 9;
 y:=n div 9;
 xx:=(x div 3)*3;
 yy:=(y div 3)*3;
 for i:= 0 to  8 do
 if i<>x then
 rem_cell(i,y,vv);
 for i:=0 to 8 do
 if i<>y then
 rem_cell(x,i,vv);
 for i:=yy to yy+2 do
 if i<>y then
 for j:=xx to xx+2 do
 if j<>x then
 rem_cell(j,i,vv);
 end;
 procedure unrem_cell(x,y,vv:longint);
 begin
 with field[y*9+x] do begin
 dec(v[vv]);
 if v[vv]=0 then
 inc(nv);
 end;
 end;
 procedure unrem_cells(n,vv:longint);
 var
 x,y,xx,yy,i,j:longint;
 begin
 x:=n mod 9;
 y:= n div 9;
 xx:=(x div 3)*3;
 yy:=(y div 3)*3;
 for i:=0 to 8 do
 if i<>x then
 unrem_cell(i,y,vv);
 for i:=0 to 8 do
 if i<>y then
 unrem_cell(x,i,vv);
 for i:=yy to yy+2 do
 if i<>y then
 for j:=xx to xx+2 do
 if j<>x then
 unrem_cell(j,i,vv);
 end;
 procedure solve(n:longint);
 var
 i:longint;
 sc:tcell;
 begin
 if n=81 then begin
 print_ans;
 inc(nsol);
 if nsol=maxsol then
 halt;
 exit;
 end;
 sc:=field[n];
 with field[n] do
 for i:=1 to 9 do
 if v[i]=0 then
 begin
 flg:=false;
 rem_cells(n,i);
 if not flg then
 begin
 field[n]:=vars0;
 nv:=1;
 v[i]:=0;
 solve(n+1);
 field[n]:=sc;
 end;
 unrem_cells(n,i);
 end;
 end;
 procedure do_rem (var f:tfield);
 var
 x,y,i:longint;
 begin
 for y:=0 to 8 do
 for x:=0 to 8 do
 with f[y*9+x] do
 if nv=1 then
 for i:=1 to 9 do
 if v[i]=0 then
 begin
 rem_cells(y*9+x,i);
 break;
 end;
 end;
 begin
 vars9.nv:=9;
 vars0.nv:=0;
 for i:=1 to 9 do
 begin
 vars9.v[i]:=0;
 vars0.v[i]:=1000;
 end;
 for i:=0 to 80 do
 field[i]:=vars9;
 for i:=0 to 8 do
 begin
 for j:=0 to 8 do begin
 read(ch);
 if ch<>'0' then
 begin
 field [i*9+j]:=vars0;
 with field [i*9+j] do
 begin
 nv:=1;
 v[ord(ch <> '0')]:=0;
 end;
 end;
 end;
 readln;
 end;
 flg:=false;
 do_rem(field);
 nsol:=0;
 if not flg then
 solve(0);
 if nsol=0 then
 writeln('There is no solution.');
 end.

Последний раз редактировалось Stilet; 20.07.2010 в 09:02.
valli вне форума Ответить с цитированием
Старый 19.07.2010, 14:18   #2
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

ты-бы хоть комментарии вставил к процедурам

ЗЫ: код тогда хорош - когда я выпил 3 литра пива и понимаю че написано
(с)
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 19.07.2010, 17:08   #3
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

я в свое время написал игру судоку с автоматической генерацией поля, остатка цифр в зависомости от сложности, подсветка цифр при совпадении в горизонтале, вертикале и в поле 3х3.
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 19.07.2010, 19:31   #4
valli
 
Регистрация: 19.07.2010
Сообщений: 3
По умолчанию

Sanprof, а ты бы мог показать свою версию программы?
valli вне форума Ответить с цитированием
Старый 21.07.2010, 14:57   #5
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

А мне интересно, вы когда поле генерируете и скрываете цифры, как вы определяете "решаемость", т.е. решается ли он логическими методами с первого раза и то что он имеет только одно решение. Или это как повезет?
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 21.07.2010, 15:09   #6
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

http://www.dailysudoku.com/sudoku/play.shtml?today=1

там простое решение в скрипте приложено, за сложным на сервер лезет
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 22.07.2010, 15:03   #7
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

Цитата:
Сообщение от valli Посмотреть сообщение
Sanprof, а ты бы мог показать свою версию программы?
Вот когда-то давно когда только учился программить выкладывал на один форум игру, сюда>> Тынц
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Судоку на Делфи Killerkod Помощь студентам 7 14.06.2011 14:52
Судоку zmey31313 Софт 7 13.05.2010 16:12
Delphi судоку fawr Помощь студентам 4 18.03.2010 23:58
Создание судоку Beliuk Паскаль, Turbo Pascal, PascalABC.NET 3 18.03.2010 16:15
[Анти]-судоку С.М.С Софт 9 25.04.2009 13:05