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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2012, 16:38   #11
zzzzza
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Код:
Var a: array[1..100, 1..100] of integer;
i,j: integer;
k: integer;
Begin
for i:=1 to 9 do begin
for j:=1 to 9 do begin
a[i,j]:=round(random(9)+1);
write(a[i,j],' ');
end;
writeln;
end;

write('Сколько переменных: ');
readln(k);
for k:=1 to k do
begin
write('Введите какая она в ряду(по горизонтале): ');
readln(j);
write('Введите какая она в столбце(по вертикале): ');
readln(i);
write('Введите значение этой переменной: ');
read(a[i,j]);
end;
writeln;


writeln('Матрица после ввода чисел');
for i:=1 to 9 do begin
for j:=1 to 9 do begin
write(a[i,j],' ');
end;
writeln;
end;
writeln;

for i:=1 to 9 do begin
for j:=1 to 9 do begin
     If (a[1,1])=(a[1,j+1]) then begin
a[i,j+1]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,2])=(a[1,j+2]) then begin
a[i,j+2]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,3])=(a[1,j+3]) then begin
a[i,j+3]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,4])=(a[1,j+4]) then begin
a[i,j+4]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,5])=(a[1,j+5]) then begin
a[i,j+5]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,6])=(a[1,j+6]) then begin
a[i,j+6]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,7])=(a[1,j+7]) then begin
a[i,j+7]:=round(random(9)+1);
j:=1;
     end;
     If (a[1,8])=(a[1,j+8]) then begin
a[i,j+8]:=round(random(9)+1);
j:=1;
     end;
end;
end;
writeln();


writeln('Матрица после проверки');
for i:=1 to 9 do begin
for j:=1 to 9 do begin
write(a[i,j],' ');
end;
writeln;
end;


end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.


Сделать хочу программу которая будет судоку решать)

Последний раз редактировалось Stilet; 05.04.2012 в 18:11.
zzzzza вне форума Ответить с цитированием
Старый 03.04.2012, 16:56   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сделать хочу программу которая будет судоку решать)
ОМГ!
вот так бы сразу и сказали!

а в поиск сходить( по этому же форуму для начала хотя бы)?!!!
Есть алгоритмы, программы (с исходниками), описания решения и т.д. и т.п..


p.s. впрочем, я посмотрю ваш код. но уже не сейчас...

Последний раз редактировалось Serge_Bliznykov; 03.04.2012 в 17:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2012, 17:43   #13
zzzzza
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Спасибо.
Последний вопрос только задам, как все-таки задать константу в программе(то есть между Begin и end.)?
zzzzza вне форума Ответить с цитированием
Старый 03.04.2012, 22:57   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Последний вопрос только задам, как все-таки задать константу в программе(то есть между Begin и end.)?
непонятненько.. что Вы имеете в виду..

это?
Код:
const
  MyConstArray : array[1..3, 1..3] of integer  =
    ((4,3,2),(5,7,9),(6,8,1));

Var 
  i, j : integer;
begin
  WriteLn('Массив, полностью заданный через константу:');
  for i:=1 to 3 do begin
    for j:=1 to 3 do
      Write(MyConstArray[i,j]:3);
    WriteLn
  end;
  Readln;
end.
или это:
Код:
Var 
  A : array[1..3, 1..3] of integer;
  i, j : integer;
begin

  A[1,1] := 1;
  A[2,2] := 2;
  A[3,2] := 3;

  A[1,3] := 7;
  
  WriteLn('Массив, частично заданный через константы прямо в программе:');
  for i:=1 to 3 do begin
    for j:=1 to 3 do
      Write(A[i,j]:3);
    WriteLn
  end;
  Readln;
end.
или пользователь должен указать, какие ячейки и чем он хочет заполнить?
так?
Код:
write('Сколько переменных: ');
readln(k);
for k:=1 to k do
begin
  repeat
    write('Введите номер строки: ');
    readln(i);
  until (i>0) and (i<=N);
  repeat
    write('Введите номер столбца: ');
    readln(j);
  until (j>0) and (j<=N);
  repeat
       write('Введите значение этой переменной: ');
       readln(a[i,j]);
      {тут желательная проверка на то, что нет пересечений по    вертикали и горизонтали}
       if Not IsValidCountInArray(i,j) then WriteLn('Обнаружено пересечение - введите другую цифру!')
   repeat until IsValidCountInArray(i,j);
end;
или в чём суть вопроса?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2012, 03:14   #15
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в общем случае, после генерации В ЦИКЛЕ очередного числа проверять, нет ли такого же в этой же строке (в этом же столбце). если такое же число нашлось - повторять цикл генерации/проверки.
Нет, Серж, есть способ проще..
Код:
for i:=1 to n do a[i]:= i;
for i:=2 to n do begin
  j:= Random(n)+1;
  b:= a[i];
  a[i]:= a[j];
  a[j]:= b
end;
Это просто демонстрация общего принципа: сначала расставить все нужные числа, потом их перемешать. Приведенный выше код можно видоизменить под конкретную задачу.

Извиняюсь за некоторый оффтоп.. ))
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 04.04.2012, 08:48   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Нет, Серж, есть способ проще..
а вот, в кои то веки, и не соглашусь!

способ с перемешиванием я сам очень уважаю, когда нужно заполнить неповторяющимися числами одномерный массив - то ему НЕТ равных.
НО! в данном случае речь идёт о игре СУДОКУ. а там двухмерный массив, цифры в нём ПОВТОРЯЮТСЯ! НО! Они повторяются так, чтобы на горизонтали и вертикали не было одинаковых. Однако каждый квадрат 3X3 содержит ПОЛНЫЙ набор от 1 до 9..

p.s. кстати, о перемешивании, ты в данном коде перемешиваешь не очень корректно - смотри по ссылочкам
я тут на форуме постоянно цитирую свой пост
"Единственное, если подходить к вопросу серьёзно, необходимо учитывать, что распределение получается неравномерным. смотри пост №11 (с) kogemrka или, статью, на которую он ссылается:
http://mazanu.com/2008/11/blog-post_20.html [QUOTE] Как не надо тасовать карты
если кратно, то алгоритм перемешивания (с нормальным распределением) должен быть такой:
Цитата:
Для (i от 1 до n-1)
Переставить i-ю карту со случайной картой от i-й до n-й
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2012, 17:20   #17
zzzzza
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Код:
Var 
  A : array[1..3, 1..3] of integer;
  i, j : integer;
begin

  A[1,1] := 1;
  A[2,2] := 2;
  A[3,2] := 3;

  A[1,3] := 7;
  
  WriteLn('Массив, частично заданный через константы прямо в программе:');
  for i:=1 to 3 do begin
    for j:=1 to 3 do
      Write(A[i,j]:3);
    WriteLn
  end;
  Readln;
end.
Тут мы задаем числа
A[1,1] := 1;
A[2,2] := 2;
A[3,2] := 3; и потом когда будет проверка, эти числа могут поменяться на другие, а мне нужно, чтобы эти числа никогда в программе больше не менялись.
zzzzza вне форума Ответить с цитированием
Старый 04.04.2012, 17:35   #18
kashirin.p
Подтвердите свой е-майл
 
Регистрация: 04.04.2012
Сообщений: 37
По умолчанию

Цитата:
Сообщение от zzzzza Посмотреть сообщение
то получилось, спасибо.
Теперь мне нужно константу уже в программе задать, то есть я задаю число с клавиатуры и мне нужно чтобы это число потом, когда я задаю проверку, не изменилось.
Тебе нужно, чтобы не менялось значение элемента матрицы? Так не меняй его. Начни заполнение матрицы с элемента, который можно менять. Не? Я че то не догнал?

Цитата:
Сообщение от zzzzza Посмотреть сообщение
Код:
Var 
  A : array[1..3, 1..3] of integer;
  i, j : integer;
begin

  A[1,1] := 1;
  A[2,2] := 2;
  A[3,2] := 3;

  A[1,3] := 7;
  
  WriteLn('Массив, частично заданный через константы прямо в программе:');
  for i:=1 to 3 do begin
    for j:=1 to 3 do
      Write(A[i,j]:3);
    WriteLn
  end;
  Readln;
end.
Тут мы задаем числа
A[1,1] := 1;
A[2,2] := 2;
A[3,2] := 3; и потом когда будет проверка, эти числа могут поменяться на другие, а мне нужно, чтобы эти числа никогда в программе больше не менялись.
Допиши условия при которых значения этих элементов меняться не будет

Последний раз редактировалось Stilet; 08.04.2012 в 20:42.
kashirin.p вне форума Ответить с цитированием
Старый 04.04.2012, 18:14   #19
zzzzza
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от kashirin.p Посмотреть сообщение
Допиши условия при которых значения этих элементов меняться не будет
Нет, я ввожу сам с клавиатуры значение переменной матрицы, допустим это a[6,2], потом, когда будет проверяться строка на совпадения, наша a[6,2] измениться на другое число.
Дальше наверное не очень понятно будет, но объясню как смогу. Задать при каких условиях не будет меняться я не могу, т.к если брать в условие i и j, то они будут меняться при проверки. Значение этого числа я взять тоже не могу, т.к они всегда разные, только если присваивать какой-то другой переменно, но это очень муторно.
zzzzza вне форума Ответить с цитированием
Старый 05.04.2012, 09:11   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

zzzzza, мне кажется, что я смутно догадываюсь, что Вам надо..
но хочу всё же уточнить, верны ли мои догадки - КАКОВА ВАША КОНЕЧНАЯ ЦЕЛЬ.

1-е. дана пустая матрица.
2-е. мы запрашиваем пользователя и позволяем в произвольные места этой матрицы (он сам выбирает) вписать нужные цифры (как Вы их называете "константы").
3-е - вы хотите заполнить матрицу случайными числами так, чтобы цифры, внесённые пользователем остались на своих местах, а остальные (случайные) числа удовлетворяли правилам СУДОКУ?!!
Так это же называется НАЙТИ РЕШЕНИЕ СУДОКУ. и для этого процесса есть АЛГОРИТМЫ! Вот их и надо применять. Перебор случайных чисел - это НЕ ЯВЛЯЕТСЯ алгоритмом решения СУДОКУ (хотя, конечно, если повторять его бесконечное число раз - то он может и дать решение - нужно только откат на предыдущее состояние предусмотреть, в том случае, когда подбор зашёл в тупик... НО ЭТО НЕ ВЫХОД - это крайне кривое и неэффективное решение. вместо случайных чисел нужно перебирать все цифры от 1 до 9.)

Поищите/почитайте о программном решении СУДОКУ и ваша проблема (если я её правильно понял) разрешится!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи на решение Pascal abc Tecka Фриланс 9 18.12.2012 22:20
Решение задач в PASCAL ABC canter Помощь студентам 2 11.03.2012 22:03
нужно решение на Pascal ABC EvilCry Помощь студентам 8 27.10.2011 12:30
(PASCAL ABC)Дана Матрица, найти индексы всех эл-ов с наибольшим значением, если таких элементов несколько Grandhustla Помощь студентам 0 25.05.2011 16:06
решение задачи в PASCAL ABC kill_01 Помощь студентам 14 19.05.2011 05:51