IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Судоку, проблема с массивом
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Появилась надобность написать программу генерации таблиц судоку (думаю, всем известна эта игра)
в инете нашел описание одного метода 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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


все, сам разобрался на свежую голову smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


появилась новая проблема sad.gif
как можно одномерный массив перевести в двумерный?
вот у меня есть 9 одномерных массивов [1..9], надо составить двумерный массив [1..9,1..9]
при такой записи
...
for j:=1 to 9 do
M[i,j]:=mas1[j];
...
ругается на несоответствие типов матриц
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

var
M: TMatr; mas1: TVec;

, то у компилятора вообще не возникнет никаких вопросов, присвоение состоится...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


опиши массив массивов или поэлементно копируй. А М где и как описана?
Сейчас увидел 9 твоих массивов. это ты сам догадался? smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(Client @ 29.11.2010 11:48) *

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

нуу, это наверное не лучший метод, но я прост ничего другого не придумал...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Кстати, вот этот кусок:
Цитата
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;

(опять же, чисто визуально, не вникая в логику...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


Цитата(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]) ...

Сообщение отредактировано: marwell -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
по твоему коду же тогда получается что 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;
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 1:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name