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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2009, 12:58   #1
Arch0000
 
Регистрация: 15.02.2009
Сообщений: 6
По умолчанию Площади квадратов

дали такое задание - даётся входной файл, в первой строке - длина и количество строк массива. Далее - строки указанной длины, состоящие из единиц и нулей. Требуется найти квадрат, заполненый только единицами, максимальной площади. выходной файл - площадь. Написать на delphi
Arch0000 вне форума Ответить с цитированием
Старый 15.02.2009, 13:25   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

От нас чего хочешь?
Баламут вне форума Ответить с цитированием
Старый 15.02.2009, 14:56   #3
Arch0000
 
Регистрация: 15.02.2009
Сообщений: 6
По умолчанию

Подскажите, как сделать
Arch0000 вне форума Ответить с цитированием
Старый 15.02.2009, 15:05   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Вот держи квадрат с единицами.Может он и не максимальный, но и не маленький.


Нашел в Инете. Файл - http://s46.radikal.ru/i111/0902/56/7972647b7198.jpg

Пожалуйста, поконкретней вопрос.Что требуется исполнить?
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 15.02.2009, 15:38   #5
Arch0000
 
Регистрация: 15.02.2009
Сообщений: 6
По умолчанию

требуется написать программу по заданным условиям - найти в заданном файле квадрат, вроде того, что у DeKot
Arch0000 вне форума Ответить с цитированием
Старый 15.02.2009, 15:55   #6
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Наконец то дошло.В файле масив типа как на рис. и можно выделить несколько квадратов из едениц.Надо определить индексы большого квадрата и перевести в новый массив типа,выделенного самого большогоНадо подумать над алгоритмом.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 15.02.2009, 16:49   #7
crc83
Пользователь
 
Аватар для crc83
 
Регистрация: 24.01.2009
Сообщений: 38
По умолчанию

Прямой перебор:
Цикл для "размер" квадрата от макс_размер до 1
Цикл для "Координата_левого_верхнего_угл а_Х" от 1 до (макс_размер-"размер")
Цикл для "Координата_левого_верхнего_угл а_У" от 1 до (макс_размер-"размер")
Если ЭтоКвадрат( "Координата_левого_верхнего_угл а_Х" , "Координата_левого_верхнего_угла_Y" , "размер" ) То Конец.
crc83 вне форума Ответить с цитированием
Старый 15.02.2009, 16:54   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Задачка понравилась, хоть и ничего особо сложного в ней нет.

Функция getlen() возвращает длину наибольшего квадрата с заданными координатами левого верхнего угла.
Т.к. пока в Делфи с файлами не работал, написал на паскале.

Файл kvadr.txt:
Код:
15 18
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 0 1 1 1 1 1 1 0 1 1
1 0 1 0 1 1 0 1 0 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1 0 0 1 0 1 1 1
1 0 1 1 1 1 0 1 1 1 1 1 1 1 1
Программа:
Код:
uses crt;
var
f : text;
i,j : integer;
M,N : integer;
matr : array[1..100,1..100] of byte;
ni,nj,teklen,clen : integer;

{-------}
function getlen(ci,cj : integer) : integer;  { - }
 var i,j,len : integer;
 fl : boolean;
 begin
 len := 1;  { изначально длина =1 }
 i:=ci;    
 j:=cj;
 fl := true;
 while fl do
  begin
  inc(len);   { увеличиваем длину }
  if (ci+len-1>M) or (cj+len-1>N) then  { если такой квадрат не влезает в исходный прямоугольник... }
   begin
   dec(len);  { уменьшаем длину }
   getlen := len;  { и возвращаем ее }
   exit;
   end;

  fl := true;    { флаг = тру. Говорит о том, что все хорошо, можно продолжать }
  for i:=ci to ci+len-1 do     { идем по последней строке квадрата }
   if matr[i,cj+len-1] = 0 then    { если там есть ноль, значит это не может быть стороной }
    begin
    fl := false;      { говорим об этом }
    break;
    end;
  if not fl then break;   

  for j:=cj to cj+len-1 do     { идем по последнему столбцу квадрата }
   if matr[ci+len-1,j] = 0 then  { если там есть ноль - это не сторона }
    begin 
    fl := false;
    break;
    end;

  end; {while}
 if not fl then dec(len);
 getlen := len;
 end;
{---------}


begin
clrscr;
assign(f,'kvadr.txt');
{$I-}
reset(f);
{$I+}
if IOResult <> 0 then
 begin
 writeln('File not found.');
 readln;
 exit;
 end;
{-------}
 { читаем количетсво столбцов и строк }
readln(f,N,M);   { M - number of strings; N - length }
for i:=1 to M do
 begin
 for j:=1 to N do
  read(f,matr[i,j]);    { читаем матрицу }
 readln(f);
 end;
close(f);
{--------}
clen := 0;  { изначально длина = 0 }
ni := 1;    { это координаты левого верхнего угла прямоугольника }
nj := 1;

{ проходим по каждому элементу матрицы }
for i:=1 to M do
 for j:=1 to N do
  if matr[i,j] = 1 then     { если текущий элемент = 1, то смотрим, насколько большой квадрат может получиться }
   begin
   teklen := getlen(i,j);  { ищем максимальную длину }
   if teklen > clen then   { если она больше ранее запомненной, то... }
    begin
    clen := teklen;  { запоминаем длину }
    ni := i;    { ...и координаты левого верхнего угла }
    nj := j;
    end;
   end;

{----------}
{ выводим исходный прямоугольник и выделяем цветом самый большой квадрат }
{ т.к. пишете на Делфи, можете не смотреть }
for i:=1 to M do
 begin
 for j:=1 to N do
  begin
  if (i>=ni) and (i<=ni+clen-1) and (j>=nj) and (j<=nj+clen-1) then
   TextColor(9)
  else TextColor(8);
  write(matr[i,j]:2);
  end;
 writeln;
 end;
TextColor(15);
writeln;
writeln('Storona = ',clen);    { выводим длину }
readln;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 15.02.2009 в 19:40. Причина: добавил комменты
Sazary вне форума Ответить с цитированием
Старый 15.02.2009, 19:29   #9
Arch0000
 
Регистрация: 15.02.2009
Сообщений: 6
По умолчанию

только проблема - я не работал с файлами в паскале. Можно переписать для дельфи, если можно, с комментариями?
Задаём переменную типа TStringList , затем в коде:
X:=Tstringlist.create;
загружаем из файла:
x.loadfromfile('///');
и у нас теперь есть массив строк, поэлементно - x.strings[i];
Можешь переделать?
Arch0000 вне форума Ответить с цитированием
Старый 15.02.2009, 19:30   #10
Arch0000
 
Регистрация: 15.02.2009
Сообщений: 6
По умолчанию

ну, или просто написать то-же, но с комментариями?
Arch0000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск площади фигуры методом Монте - Карло ChertYaGa Паскаль, Turbo Pascal, PascalABC.NET 12 10.02.2017 20:10
Паскаль Вычисление площади Unikummm Помощь студентам 16 04.02.2009 06:52
нарисовать окружность состоящую из 36 разноцветных квадратов Invisible Hunter Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2008 18:03
Нарисовать на координатной площади линию a*x+b*y+c=0 НУБ!!! Общие вопросы Delphi 4 13.05.2008 22:48