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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2009, 19:53   #1
Med
 
Регистрация: 19.03.2009
Сообщений: 6
По умолчанию Задача на работу с матрицай...

Задача: Заменить нулями эл-ты матрицы, стоящие на пересечении строк и столбцов, в которых имеется хотя бы по одному нулю.

Пару примеров:

1.

1 2 0
0 5 6
7 8 9

вот: программа должна заменить эл-ты "1" и "6" на "0"

2.

1 2 3
4 0 6
0 8 9

вот: программа должна заменить эл-ты "4" и "8" на "0"


Программу я попытался сделать, но при тестировании пришел к выводу, что она работает неверно

Если кто знает как решить, подскажите что нибудь...

свой код программы могу выложить, если надо

а.., еще программу желательно реализовать на делфи
Med вне форума Ответить с цитированием
Старый 22.03.2009, 09:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дополнительный массив использовать можно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2009, 10:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, обошелся без дополнительного массива, применив множества.
пример во вложении. кнопку "Работать!" можно нажимать многократно ;-)
претензии по поводу вывода массивов на канву не принимаются (так же как и претензии по внешнему виду) — это я просто прикалывался Вывод массивов переделаете под себя самостоятельно.

основная идея такая:
две функции перебирают строки/столбцы и возращают True если в строке/столбце есть нули:
Код:
function TForm1.IsZero_in_Column(Col: integer): boolean;
var i : integer;
begin
  Result := false;
  i := 1;
  while (i<=M) and (A[Col,i]<>0) do inc(i);
  if (i<=M) then Result := true;
end;

function TForm1.IsZero_in_Row(Row: integer): boolean;
var i : integer;
begin
  Result := false;
  i := 1;
  while (i<=N) and (A[i, Row]<>0) do inc(i);
  if (i<=N) then Result := true;
end;
запоминаем, строки/столбцы с нулями так:
Код:
    SetOfZeroRow : set of byte;
    SetOfZeroColumn : set of byte;
...
begin
  SetOfZeroColumn := [];
  SetOfZeroRow := [];
  for i:=1 to N do
    if IsZero_in_Column(i) then 
      SetOfZeroColumn := SetOfZeroColumn + [i];
  for i:=1 to M do
    if IsZero_in_Row(i) then 
      SetOfZeroRow := SetOfZeroRow + [i];
замена происходит так:
Код:
  // а вот собственно и замена пересечений на нули:
  for i:=1 to N do
   for j:=1 to M do
     if (i in SetOfZeroColumn) and (j in SetOfZeroRow) then
       A[i,j] := 0;
Вложения
Тип файла: rar Zero1.rar (134.3 Кб, 6 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на работу с двумерным массивом.Найти количество прямоугольников. anta Общие вопросы C/C++ 6 05.01.2009 15:23
ищю работу Sergeu Фриланс 41 30.08.2008 10:56
задача на работу с файлами и строками MiH@N Помощь студентам 8 24.06.2008 00:44
Задача про работу с некоторым конструктивным объектом (напр. матрицей, графом, и т. д.) ACE Valery Помощь студентам 2 03.05.2008 19:22