В матрице найти наибольший квадрат состоящий из единиц - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Задание: В матрице найти наибольший квадрат состоящий из едениц. Сама матрица состоит из 1 и 0. Помогите пожалуйста
Листинг программы
  1. uses crt;
  2. var a:array[1..100, 1..100] of integer;
  3. i, j, n, k, l, z, x, y:integer;
  4. f:text;
  5. ok, next:boolean;
  6. begin
  7. clrscr;
  8. assign(f, 'input.txt');
  9. reset(f);
  10. readln(f, n) ;
  11. for i:=1 to n do for j:=1 to n do read(f, a[i,j]);
  12. close(f);
  13. z:=0;
  14. next:=true;
  15. while true do begin
  16. if not next then break;
  17. next:=false;
  18. for i:=1 to n do begin
  19. if next then break;
  20. for j:=1 to n do begin
  21. if next then break;
  22. if a[i,j]=0 then begin
  23. ok:=true;
  24. for k:=i to i+z do begin
  25. if not ok then break;
  26. for l:=j to j+z do begin
  27. if (l>n) or (k>n) then begin ok:=false; break; end;
  28. if a[k, l]<>0 then begin ok:=false; break; end;
  29. if (k=i+z) and (l=j+z) and (a[k, l]=0) then begin
  30. inc(z);
  31. x:=i; y:=j;
  32. next:=true;
  33. end;
  34. end;
  35. end;
  36. end;
  37. end;
  38. end;
  39. end;
  40. for i:=1 to n do begin
  41. for j:=1 to n do begin
  42. if (i>=x) and (i<=x+z-1) and (j>=y) and (j<=y+z-1) then begin
  43. TextColor(15);
  44. write(a[i, j], ' ');
  45. end
  46. else begin
  47. TextColor(8);
  48. write(a[i, j], ' ');
  49. end
  50. end;
  51. writeln;
  52. end;
  53. end.

Решение задачи: «В матрице найти наибольший квадрат состоящий из единиц»

textual
Листинг программы
  1. begin
  2.   var N := ReadLnInteger('N =');
  3.   var A : array [,] of Integer; SetLength(A, N, N);
  4.  
  5.   N -= 1;
  6.   Randomize;
  7.   for var Row := 0 to N do
  8.     begin
  9.       for var Col := 0 to N do
  10.         begin
  11.           A[Row,Col] := Random(0,2) = 0 ? 0 : 1;
  12.           Write(A[Row,Col]:2);
  13.         end;
  14.       WriteLn;
  15.     end;
  16.  
  17.   /// Координаты и размер квадрата
  18.   var maxRow := 0;
  19.   var maxCol := 0;
  20.   var maxVal := 0;
  21.  
  22.   /// Для каждой единички
  23.   for var Row := 0 to N do
  24.     for var Col := 0 to N do
  25.       if A[Row,Col] = 1 then
  26.         begin
  27.  
  28.           /// Найдём размер квадрата
  29.           var Quare := True;
  30.           var qSize := 0;
  31.           repeat
  32.             qSize += 1;
  33.             Quare := (Row+qSize < N) and (Col+qSize < N);
  34.             if Quare then
  35.               begin
  36.                 /// Сканируем квадрат
  37.                 /// (Не оптимально. Можно было бы сканировать только правую и нижнюю сторону ;-)
  38.                 for var dRow := Row to Row + qSize do
  39.                   for var dCol := Col to Col + qSize do
  40.                     Quare := Quare and (A[dRow,dCol] = 1);
  41.               end;
  42.           until Not Quare;
  43.          
  44.           /// Запомним наибольший
  45.           if qSize > maxVal then
  46.             begin
  47.               maxRow := Row;
  48.               maxCol := Col;
  49.               maxVal := qSize;
  50.             end;
  51.         end;
  52.        
  53.   WriteLn('The max square = ', maxVal);
  54.   WriteLn('Left-top = ', maxRow+1, 'x', maxCol+1);
  55. end.

Объяснение кода листинга программы

  1. Ввод размера матрицы N.
  2. Инициализация матрицы случайными единицами и нулями.
  3. Поиск наибольшего квадрата, состоящего из единиц, начиная с верхнего левого угла.
  4. Проверка каждого элемента матрицы на равенство единице.
  5. Если элемент равен единице, то проверяется размер квадрата, начиная с этого элемента.
  6. Если размер квадрата больше текущего максимального, то обновляются координаты и размер максимального квадрата.
  7. Вывод сообщения о найденном максимальном квадрате и его координатах.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы