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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2010, 22:12   #1
c0zak
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 36
По умолчанию Волшебный квадрат 3-го порядка

Думаю, что не мне одному выпало несчастье писать программу для вычисления этого самого квадрата. Напомню что это-представляет собой квадрат 3х3 в котором сумма цифр в строках и столбцах одинакова (в случае квадрата 3-го порядка эта сумма равна 15).
Программу писал в 2 этапа. 1-создания словаря, 2-поиск нужных значений.
Этап 1:
Код:
program formagicquadro;
{$APPTYPE CONSOLE}
uses
  SysUtils;
  var f:text; b:integer; c:string; h,i,l:integer;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;

   begin
     assign(f,'BD.txt');
     rewrite(f);
     for b:=123456789 to 987654321 do
       begin
       c:=inttostr(b);
       for i:=1 to 9 do
       begin
       l:=0;
        for h:=1 to 9 do
          begin
          If c[h]=inttostr(i) Then
          begin
           Inc(l);
          end;
          end;
          if l<>1 then
          break;
       end;
 if l=1 then
  begin
  writeln(f,c);
end;
   end;
  close(f);
   end;
 end.
Этап 2:

Код:
program quadro;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var f,f2:textfile; a:string; b:array[1..9] of integer; c,e,g:integer;
d:array[1..3,1..3] of integer; m:array[1..6] of integer;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
 begin
    assign(f,'bd2.txt');
    assign(f2,'quadro.txt');
    reset(f);
    rewrite(f2);
    while not EOF(f) do
    begin
      readln(f,a);
       for c:=1 to 9 do
         begin
           b[c]:=strtoint(a[c]);
         end;
         g:=1;
       for c:=1 to 3 do begin
          for e:=1 to 3 do begin
          d[c,e]:=b[g];
          inc(g);
           end;end;
          m[1]:=d[1,1]+d[1,2]+d[1,3];
          m[2]:=d[2,1]+d[2,2]+d[2,3];
          m[3]:=d[3,1]+d[3,2]+d[3,3];
          m[4]:=d[1,1]+d[2,1]+d[3,1];
          m[5]:=d[1,2]+d[2,2]+d[3,2];
          m[6]:=d[1,3]+d[2,3]+d[3,3];
          if (m[1]=m[2]) and (m[2]=m[3]) and (m[3]=m[4])
          and (m[4]=m[5]) and (m[5]=m[6]) then begin
          writeln(f2,a);
          end;
   end;
    close(f);
    close(f2);
    end;
end.
Прошу прощения за кривые названия переменных и отсутствие комментов-не до того было. Тем более что код вполне прозрачен =)

исполнение 1-го кода заняло минут 40, так что чтобы не мучить вас ожиданием генерации словаря привожу листинг значений:

159672834
159834672
168573924
168924573
186537942
186942537
195627843
195843627
249681735
249735681
267483915
267915483
276438951
276951438
294618753
294753618
348591726
348726591
357492816
357816492
375429861
375861429
384519762
384762519
429375861
429861375
438276951
438951276
483267915
483915267
492357816
492816357
519384762
519762384
537186942
537942186
573168924
573924168
591348726
591726348
618294753
618753294
627195843
627843195
672159834
672834159
681249735
681735249
726348591
726591348
735249681
735681249
753294618
753618294
762384519
762519384
816357492
816492357
834159672
834672159
843195627
843627195
861375429
861429375
915267483
915483267
924168573
924573168
942186537
942537186
951276438
951438276

(запись как вы надеюсь догадались запись чисел идёт в порядке заполнения строк)
Например для 951438276:
9|5|1
4|3|8
2|7|6



Если кто видит пути оптимизации проги-милости прошу и заранее спасибо =)
Твои сны-как лотерея, это то что мы умеем... ©СЛОТ

Последний раз редактировалось c0zak; 15.03.2010 в 22:18.
c0zak вне форума Ответить с цитированием
Старый 15.03.2010, 22:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
    c:=inttostr(b);
//в качестве переменной цикла вполне можно использовать char
       for i:='1' to '9' //for i:=1 to 9 do
       begin
       l:=0;
        for h:=1 to 9 do
          begin
//в результате избавляемся от кучи inttostr
          if c[h]=i then //If c[h]=inttostr(i) Then
          begin
           Inc(l);
if l>1 then break; //дальше то зачем считать мы же все равно отбираtv только те где i=1
          end;
          end;
          if l<>1 then
          break;
       end;
как улучшить проверку все цифры разные
Код:
dublechar:=false;
for k:=1 to 9 //здесь конечно можно и 8 написать 
begin
  for j:=k+1 to 9 // перебираем только то что стоит после
// lто что до мы уже проверяли
  begin
     doblechar:=( c[k]=c[j] );// пока разные doblechar будет false
     if dublechar then break;//если нашли повтор (true) то нам больше ничего не надо
  end;
  if dublechar then break;
end;
if not dublechar then 
  writeln....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось Stilet; 16.03.2010 в 08:36.
evg_m вне форума Ответить с цитированием
Старый 15.03.2010, 23:05   #3
c0zak
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 36
По умолчанию

if l>1 then break;
Вот по части этого не согласен-вполне возможно что останется 0. допустим число 223456789, 1 там нет, но оно тоже запишется, т.к l не больше 1 =) но всё равно спасибо, второй вариант попробую =)
Твои сны-как лотерея, это то что мы умеем... ©СЛОТ
c0zak вне форума Ответить с цитированием
Старый 16.03.2010, 08:48   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
допустим число 223456789, 1 там нет, но оно тоже запишется
а зачем его записывать если ДВЕ двойки
Цитата:
if l>1 then break;
Вот по части этого не согласен-вполне возможно что останется 0.
значит не совсем правильно интерпретировал задачи выполняемые вошим кодом.
Именно для этих целей и служит комментарий. описывать (пояснять) задачи предметной области которые ДОЛЖЕН выполнять тот или иной участок кода. чтобы потом (тебе самому или другому программисту например МНЕ) можно было проверить а делает ли программа то что нужно (что хотел программист).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 16.03.2010, 16:26   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от c0zak Посмотреть сообщение
Если кто видит пути оптимизации проги-милости прошу и заранее спасибо =)
Почитайте про перебор с возвратами. Для такой задачи время выполнения должно быть не более секунды (и код раза в два меньше).
alexBlack вне форума Ответить с цитированием
Старый 16.03.2010, 17:14   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

читайте алгоритмы составления маг. квадрата. Ваш вариант перебором никуда не годится
http://ru.wikipedia.org/wiki/%D0%9C%...80.D0.B0.D1.82
NiCola999 вне форума Ответить с цитированием
Старый 16.03.2010, 17:16   #7
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

А для чего этот словарь??? Вообще не понял, для чего первая прога.

Я бы посоветовал вместо наивного перебора 864197533 вариантов в поисках непонятно чего написать сразу перебор всех перестановок 9 цифр, будет 9!=362880, даже при не очень пряморукой реализации там всего на несколько секунд вычислений.
LeBron вне форума Ответить с цитированием
Старый 16.03.2010, 21:18   #8
c0zak
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 36
По умолчанию

Цитата:
Сообщение от LeBron Посмотреть сообщение
А для чего этот словарь??? Вообще не понял, для чего первая прога.

Я бы посоветовал вместо наивного перебора 864197533 вариантов в поисках непонятно чего написать сразу перебор всех перестановок 9 цифр, будет 9!=362880, даже при не очень пряморукой реализации там всего на несколько секунд вычислений.
Мысль в голову приходила, но моё знакомство с комбинаторикой не позволило мне придумать метод реализации...Если приведёте алгоритм буду весьма бладарен =)
Твои сны-как лотерея, это то что мы умеем... ©СЛОТ
c0zak вне форума Ответить с цитированием
Старый 16.03.2010, 22:20   #9
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от c0zak Посмотреть сообщение
Мысль в голову приходила, но моё знакомство с комбинаторикой не позволило мне придумать метод реализации...Если приведёте алгоритм буду весьма бладарен =)
Забить в массив числа от 1 до 9 и 9! раз генерить следующую перестановку. Остальное то же (перебор с проверкой).
LeBron вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление X n-го порядка // delphi, pascal JENqa Помощь студентам 2 26.12.2008 17:02
Вычисление определителя n-го порядка gool Паскаль, Turbo Pascal, PascalABC.NET 1 11.12.2008 10:59
Delphi, матрица n-го порядка ПаФка Помощь студентам 1 09.12.2008 14:55
Матрица n-го порядка deadh5n1 Помощь студентам 1 07.12.2008 14:03