Помощь - Поиск - Пользователи - Календарь
Полная версия: Судоку
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
Появилась надобность написать программу генерации таблиц судоку (думаю, всем известна эта игра)
в инете нашел описание одного метода http://malover.ucoz.ru/sudoku/
естественно, выбрал третий способ.
но есть проблема, в 3 пункте при получении второй строки мне надо собрать один массив из трех.Никак не могу придумать, как это сделать в цикле
var i,x,j:integer;
mas1,mas2,mas3,mas4,mas5,mas6,mas7,mas8,mas9:array [1..9] of integer;
A,B,C:array [1..3] of integer;
flag:boolean;

procedure Ran; // генерирую число
begin
Randomize;
x:=Random(9)+1;
end;

procedure Fla; //проверка строки(для избежания повтора)
begin
for j:=1 to 9 do
if mas1[j]=x then flag:=False;
end;

begin
Flag:=True;
i:=1;
While i<=9 do begin
Ran;
Fla;
if Flag=True then begin
mas1[i]:=x; i:=i+1; end
else Flag:=True;
end;
for i:=1 to 3 do begin
if i=1 then begin
A[i]:=mas1[1];
B[i]:=mas1[4];
C[i]:=mas1[7]; end;
if i=2 then begin
A[i]:=mas1[2];
B[i]:=mas1[5];
C[i]:=mas1[8]; end;
if i=3 then begin
A[i]:=mas1[3];
B[i]:=mas1[6];
C[i]:=mas1[9]; end;
end;
...
end.
буду благодарен совету
marwell
все, сам разобрался на свежую голову smile.gif
marwell
появилась новая проблема sad.gif
как можно одномерный массив перевести в двумерный?
вот у меня есть 9 одномерных массивов [1..9], надо составить двумерный массив [1..9,1..9]
при такой записи
...
for j:=1 to 9 do
M[i,j]:=mas1[j];
...
ругается на несоответствие типов матриц
volvo
Не знаю, правильно ли то, что ты делаешь, но если массивы описаны вот так:

type
TVec = array[1 .. 9] of integer;
TMatr = array[1 .. 9] of TVec;

var
M: TMatr; mas1: TVec;

, то у компилятора вообще не возникнет никаких вопросов, присвоение состоится...
Client
опиши массив массивов или поэлементно копируй. А М где и как описана?
Сейчас увидел 9 твоих массивов. это ты сам догадался? smile.gif
marwell
Цитата(Client @ 29.11.2010 11:48) *

опиши массив массивов или поэлементно копируй. А М где и как описана?
Сейчас увидел 9 твоих массивов. это ты сам догадался? smile.gif

нуу, это наверное не лучший метод, но я прост ничего другого не придумал...
volvo
Кстати, вот этот кусок:
Цитата
for i:=1 to 3 do begin
if i=1 then begin
A[i]:=mas1[1];
B[i]:=mas1[4];
C[i]:=mas1[7]; end;
if i=2 then begin
A[i]:=mas1[2];
B[i]:=mas1[5];
C[i]:=mas1[8]; end;
if i=3 then begin
A[i]:=mas1[3];
B[i]:=mas1[6];
C[i]:=mas1[9]; end;
end;
я бы переписал так:
for i := 1 to 3 do
begin
A[i] := mas1[(i - 1)*3 + 1];
B[i] := mas1[(i - 1)*3 + 2];
C[i] := mas1[(i - 1)*3 + 3];
end;

(опять же, чисто визуально, не вникая в логику...)
marwell
Цитата(volvo @ 29.11.2010 11:47) *

Не знаю, правильно ли то, что ты делаешь, но если массивы описаны вот так:

type
TVec = array[1 .. 9] of integer;
TMatr = array[1 .. 9] of TVec;

var
M: TMatr; mas1: TVec;

, то у компилятора вообще не возникнет никаких вопросов, присвоение состоится...

спасибо, работает smile.gif

Добавлено через 3 мин.
Цитата(volvo @ 29.11.2010 11:59) *

Кстати, вот этот кусок:
я бы переписал так:
for i := 1 to 3 do
begin
A[i] := mas1[(i - 1)*3 + 1];
B[i] := mas1[(i - 1)*3 + 2];
C[i] := mas1[(i - 1)*3 + 3];
end;

(опять же, чисто визуально, не вникая в логику...)

да, ты прав, так получше

Добавлено через 9 мин.
хотя, кажется я поторопился
по твоему коду же тогда получается что A[1]=(mas1[1], mas1[4], mas1[7])
а мне надо чтобы было вот так A[1]=(mas1[1], mas1[2], mas1[3]) ...
volvo
Цитата
по твоему коду же тогда получается что A[1]=(mas1[1], mas1[4], mas1[7])
Ну да...

for i := 1 to 3 do
begin
A[i] := mas1[3*(i-1) + 1];
B[i] := mas1[3*(i-1) + 2];
C[i] := mas1[3*(i-1) + 3];
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.