Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 318

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Решаю задачу - в матрице из 1 и 0 найти самый большой прямоугольник из 0
Написала код, но он не работает((
Как устранить ошибку не знаю, проверяла логику уже сотни раз что-то исправляла, что то добавляла, но по прежнему не работает
В приложение прикладываю код с пометками, что, кто и как там
А в остальном не знаю что добавить
Очень надеюсь на вашу помощь
Заранее спасибо =-)

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. const n=10;{visota, stroki} m=5;{shirina, stolb}
  9. type mas=array[1..n,1..m]of integer;
  10. var i,j,q,w,e,w2:integer;
  11. a:mas;
  12. xnach,ynach:integer; {coordinati levogo verhnego tekushego}
  13. xcon,ycon:integer;
  14. x1,x2,y1,y2:integer;{koordinati max priam}
  15. smax,s:integer;
  16. k{shirina priam.},t{visota}:integer;
  17. rabotaem:boolean;{dlia prekrashenia poiska priamoygol'nika v tekyshei iacheike}
  18.  
  19. procedure vivod(a:mas;n,m:integer);
  20. begin
  21. for i:=1 to n do
  22. begin
  23. for j := 1 to m do
  24. write(a[i,j],' ');
  25. writeln;
  26. end;
  27. end;
  28.  
  29. begin
  30.  
  31. randomize;
  32. for i:= 1 to n do
  33. for j:= 1 to m do
  34. a[i,j]:=random(2);
  35.  
  36. vivod(a,n,m);
  37. s:=0; {s tekyshego}
  38. smax:=1; {max s poschitannay}
  39. rabotaem:=true;
  40.  
  41. for i:=1 to n do
  42. for j:= 1 to m do
  43. if a[i,j]=0 then
  44. begin {5}
  45. xnach:=i; ynach:=j;
  46. t:=i; k:=j;{stroki}
  47. w:=0;
  48.  
  49. while (a[t,k]=0) and (t<=n) do
  50. begin
  51. t:=t+1;
  52. w:=w+1;
  53. end;
  54. s:=s+w;
  55. xcon:=t-1; ycon:=k; writeln('1 ',t,' ',w,' ',s,' ',xcon,' ',ycon);
  56. if s>smax then
  57. begin
  58. smax:S;
  59. x1:=xnach;
  60. x2:=xcon;
  61. y1:=ynach;
  62. y2:=ycon;
  63. end;
  64.  
  65. while (w<>0) do
  66. begin{3}
  67. w2:=0;{sravnenie kol-va stolbcov v dr.strokah}
  68. for e:=j+1 to m do
  69. begin {4}
  70. for q := 1 to w do if a[i+q-1,e]=0 then w2:=w2+1;
  71. s:=s+w;
  72. if w2=w then
  73. begin
  74. s:=s+w;
  75. ycon:=ycon+1;
  76. if s>smax then
  77. begin
  78. smax:S;
  79. y2:=ycon;
  80. end;
  81. end
  82. else
  83. begin
  84. w:=w-1;
  85. if w2<>0 then
  86. begin
  87. s:=s-(e-1);
  88. xcon:=xcon-1;
  89. if s>smax then
  90. begin
  91. smax:S;
  92. y2:=ycon;
  93. x2:=xcon;
  94. end;
  95. end;
  96. w2:=0;
  97. end;
  98. end; {4}
  99. w:=0;
  100. s:=0
  101. end;{3}
  102.  
  103. end; {5}
  104. Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2);
  105. readln;
  106. end.


Haenta Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Haenta (статус: Посетитель)
Вопрос отправлен: 25 мая 2011, 19:57
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 26 мая 2011, 18:19; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 25 мая 2011, 20:07 [#1]:

Ты серьёзно реально думаешь, что кто-то будет копаться в этой жуткой писанине? Проще и быстрее с нуля написать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Haenta

Haenta (статус: Посетитель), 25 мая 2011, 20:18 [#2]:

Мы ещё только учимся, поэтому не всё сразу получается
В коде есть расшифровки
Если бы всё было так легко и просто, наверное, уже всё бы решили и написали..
Всё же надеюсь на помощь с указанием ошибки в коде..
А кофе на клавиатуру тоже вирус пролил?
min@y™

min@y™ (статус: Доктор наук), 25 мая 2011, 20:25 [#3]:

Я ж вижу, что код был написано на турбо-паскале, причём писарь не знал, как переключать раскладку клавиатуры в DOS-окне и писал комменты транслитом, от которого глаза режет. Также блещут профессионализмом одно- и двухбуквенные имена переменных. Я сильно сомневаюсь, что кто-то на этои портале будет препарировать этот код и делать рефакторинг, т.к. на это уйдёт на порядок больше времени, чем на написание программы с нуля.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 25 мая 2011, 20:29 [#4]:

Что значит не работает? какую ошибку выдает?
Haenta

Haenta (статус: Посетитель), 25 мая 2011, 20:33 [#5]:

А ошибки нет, просто работает не правильно: высчитывает непонятное число
А кофе на клавиатуру тоже вирус пролил?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 25 мая 2011, 20:44 [#6]:

логику как проверяли?
Haenta

Haenta (статус: Посетитель), 25 мая 2011, 20:48 [#7]:

Произвольную матрицу брала, смотрела какие значения у переменных получались и какие должны были быть
Значения не совпадали(
А кофе на клавиатуру тоже вирус пролил?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 25 мая 2011, 21:01 [#8]:

Цитата (Haenta):

Произвольную матрицу брала, смотрела какие значения у переменных получались и какие должны были быть

это не логику проверяли, а результат работы. Поставьте себя на место компьютера. Возьмите небольшую произвольную матрицу и попробуйте выполнить программу вручную. Может найдете где ошибка в алгоритме.
Haenta

Haenta (статус: Посетитель), 25 мая 2011, 21:05 [#9]:

Мережников Андрей:
>Возьмите небольшую произвольную матрицу и попробуйте выполнить программу вручную. Может найдете где ошибка в алгоритме.

Так тоже делала найти не получается
Точнее находила исправляла, находтла исправляла и все равно не работает
А кофе на клавиатуру тоже вирус пролил?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 25 мая 2011, 22:07 [#10]:

min@y правильно сказал - переименуйте переменные так, чтобы понятно было какая за что отвечает и напишите нормальные комментарии - самой проще разобраться будет. Что такое, например, переменные w и w2? Черт ногу сломит.
Haenta

Haenta (статус: Посетитель), 25 мая 2011, 23:16 [#11]:

ну вот..

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const n=10;{высота, строки} m=5;{ширина, столбцы}
  type mas=array[1..n,1..m]of integer;
  var i,t,q:integer;{счетчики строк}
      k,j,e:integer; {счетчики столбцов}
      w,w2:integer;{w-кол-во подрядидущих 0 справа от текущего элемента матрицы}
      a:mas;       {w2-кол-во подряд идущих 0 справа от элемента под текущим в строке e}
      xnach,ynach:integer; {координаты левого верхнего угла текущего прямоугольника}
      xcon,ycon:integer; {координаты правого нижнего угла текущего}
      x1,x2,y1,y2:integer;{координаты наибольшего прямоугольника}
      smax,s:integer; {площади наибольшего и текущего}
 
procedure vivod(a:mas;n,m:integer);
  begin
    for i:=1 to n do
     begin
      for j := 1 to m do
        write(a[i,j],' ');
      writeln;
     end;
  end;
 
begin
randomize;
 for i:= 1 to n do
   for j:= 1 to m do
     a[i,j]:=random(2);
vivod(a,n,m);
 
s:=0;
smax:=1;
 
for i:=1 to n do
for j:= 1 to m do
  if a[i,j]=0 then  {текущий элемент}
  begin {5}
    xnach:=i; ynach:=j;
    t:=i;     k:=j;
    w:=0;
 
        while (a[t,k]=0) and (t<=n) do  {в право от текущего }
          begin
          t:=t+1;
          w:=w+1;                       {считая 0}
          end;
        s:=s+w;
        xcon:=t-1; ycon:=k;   {сохраняем координаты правого нижнего угла текущего}
        if s>smax then
           begin
             smax:S;     {сравниваем площ.текузего с площ.максимального}
             x1:=xnach;
             x2:=xcon;    {сохраняем координаты максимального}
             y1:=ynach;
             y2:=ycon;
           end;
 
         while (w<>0) do
           begin{3}
             w2:=0;
             for e:=j+1 to m do {от столбца текущего до конечного}
               begin {4}
                 for q := 1 to w do if a[i+q-1,e]=0 then w2:=w2+1;{*}
                 s:=s+w;    {*считаем подряд идущие 0 справа от эл-та под текущим в строке e}
                 if w2=w then  {если значения совпадают значит фигура прямоугольник}
                   begin
                     s:=s+w;
                     ycon:=ycon+1;
                     if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                       end;
                   end
                 else
                 begin {не совпадают - уменьшаем W до тех пор пока колво 0 в строках не совпадет}
                   w:=w-1;
                   if w2<>0 then
                     begin    {если w2=0 то площадь ненадо уменьшать}
                      s:=s-(e-1);
                      xcon:=xcon-1;
                      if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                         x2:=xcon;
                       end;
                     end
                   else w:=0; {если w2=0 то следущие строки проверять не нужно}
                   w2:=0;
                 end;
               end;  {4}
             w:=0;
             s:=0;
           end;{3}
 
  end;  {5}
 Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2);
 readln;
end.
А кофе на клавиатуру тоже вирус пролил?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 мая 2011, 05:50 [#12]:

Цитата (Haenta):

while (a[t,k]=0) and (t<=n) do {в право от текущего } begin t:=t+1;

если t - это счетчик строк, то почему перемещение вправо - ассоциируется с перемещением по строкам?
min@y™

min@y™ (статус: Доктор наук), 26 мая 2011, 08:10 [#13]:

Цитата (Haenta):

ну вот..

Понятней не стало.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Haenta

Haenta (статус: Посетитель), 26 мая 2011, 18:19 [#14]:

было напутано со стороками и столбцами, но не работает по прежнему..(

program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const n=10;{высота, строки} m=5;{ширина, столбцы}
  type mas=array[1..n,1..m]of integer;
  var i,t,q:integer;{счетчики строк}
      k,j,e:integer; {счетчики столбцов}
      w,w2:integer;{w-кол-во подрядидущих 0 справа от текущего элемента матрицы}
      a:mas;       {w2-кол-во подряд идущих 0 справа от элемента под текущим в строке e}
      xnach,ynach:integer; {координаты левого верхнего угла текущего прямоугольника}
      xcon,ycon:integer; {координаты правого нижнего угла текущего}
      x1,x2,y1,y2:integer;{координаты наибольшего прямоугольника}
      smax,s:integer; {площади наибольшего и текущего}
 
procedure vivod(a:mas;n,m:integer);
  begin
    for i:=1 to n do
     begin
      for j := 1 to m do
        write(a[i,j],' ');
      writeln;
     end;
  end;
 
begin
randomize;
 for i:= 1 to n do
   for j:= 1 to m do
     a[i,j]:=random(2);
vivod(a,n,m);
 
s:=0;
smax:=1;
 
for i:=1 to n do  {строки}
for j:= 1 to m do   {столбцы}
  if a[i,j]=0 then  {текущий элемент}
  begin {5}
    ynach:=i; xnach:=j;
    t:=i;     k:=j;
    w:=0;
 
        while (a[t,k]=0) and (k<=m) do  {в право от текущего }
          begin
          k:=k+1;
          w:=w+1;                       {считая 0}
          end;
        s:=s+w;
        ycon:=t; xcon:=k-1;   {сохраняем координаты правого нижнего угла текущего}
        if s>smax then
           begin
             smax:S;     {сравниваем площ.текузего с площ.максимального}
             x1:=xnach;
             x2:=xcon;    {сохраняем координаты максимального}
             y1:=ynach;
             y2:=ycon;
           end;
 
         while (w<>0) do
           begin{3}
             w2:=0;
             for q:=i+1 to n do {от столбца текущего до конечного}
               begin {4}
                 for e := 1 to w do if a[q,j+e-1]=0 then w2:=w2+1;{*}
                 s:=s+w;    {*считаем подряд идущие 0 справа от эл-та под текущим в строке q}
                 if w2=w then  {если значения совпадают значит фигура прямоугольник}
                   begin
                     s:=s+w;
                     ycon:=ycon+1;
                     if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                       end;
                   end
                 else
                 begin {не совпадают - уменьшаем W до тех пор пока колво 0 в строках не совпадет}
                   w:=w-1;
                   if w2<>0 then
                     begin    {если w2=0 то площадь ненадо уменьшать}
                      s:=s-(e-1);
                      xcon:=xcon-1;
                      if s>smax then
                       begin
                         smax:S;
                         y2:=ycon;
                         x2:=xcon;
                       end;
                     end
                   else w:=0; {если w2=0 то следущие строки проверять не нужно}
                   w2:=0;
                 end;
               end;  {4}
             w:=0;
             s:=0;
           end;{3}
 
  end;  {5}
 Writeln(smax,' ploshad ',x1,' ',y1,' ',x2,' ',y2);
 readln;
end.
А кофе на клавиатуру тоже вирус пролил?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.04 сек.