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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 15:17   #1
Almi
 
Регистрация: 09.11.2010
Сообщений: 4
Вопрос работа с 2D массивом delphi

Имеется двумерный массив допустим такой
3 0 4
0 5 7
4 0 0
нужно сделать так чтобы в каждой строке и каждом столбце был только один 0 лишние нули можно просто заменить любым числом. (Это часть решения задачи о назначениях венгерским методом)
Я пытаюсь сделать так: проверяем строку, и если в ней только один 0 того проверяем тот столбец в котором стоит этот 0 на наличие других нулей, и если они есть, то заменяем их на 1. Тем самым должны получить
3 0 4
0 5 7
4 1 0
вот код который я пытаюсь написать, но он считает не верно, подскажите пожалуйста в чем ошибка.
Код:
  for i:=1 to n do begin
  k:=0;
      for j:=1 to n do begin
        x:=StrToFloat(tabl1.Cells[j,i]);
        if x=0 then
        k:=k+1;
        z:=j;

      end;
      if k=1 then
      k:=0;
      for j:=1 to n do begin
          x:=StrToFloat(tabl1.Cells[z,j]);
        if x=0 then
        k:=k+1;
        if k>1 then
        tabl1.Cells[z,j]:=FloatToStr(1);
        k:=1;
      end;
  end;
Almi вне форума Ответить с цитированием
Старый 12.11.2010, 16:59   #2
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

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

Код:
var waszero: boolean;
for i := 1 to n do    // цикл по строкам
  begin
    waszero := false;
    for j := 1 to n do
    begin
      if (a[i][j] = 0) and (waszero = false) then waszero := true;
      if (a[i][j] = 0) and (waszero = true) then a[i][j] := random(10)+1;
    end;
  end;

for j := 1 to n do    // цикл по столбцам
  begin
    waszero := false;
    for i := 1 to n do
    begin
      if (a[i][j] = 0) and (waszero = false) then waszero := true;
      if (a[i][j] = 0) and (waszero = true) then a[i][j] := random(10)+1;
    end;
  end;
Риндера вне форума Ответить с цитированием
Старый 12.11.2010, 20:33   #3
Almi
 
Регистрация: 09.11.2010
Сообщений: 4
По умолчанию

У меня первая мысль была сделать именно так, но подумав я понял что мне это не подходит.
Мне нужно чтобы в каждой строке и каждом столбце остался один ноль, а по вашему алгоритму останутся столбцы вообще без нулей.
Я постарался сделать свой алгоритм более читабельным, и немного исправил его. Хотя он все равно считает не верно посмотрите пожалуйста, может удастся найти ошибку.
Код:
  for i:=1 to n do  {цикл по строкам}
   begin
    schetnul:=0;
    for j:=1 to n do
     begin
      x:=StrToFloat(tabl1.Cells[j,i]);
      if x=0 then
      inc(schetnul);
      z:=j;    {номер столбца с нулем}
      if schetnul>1 then
      break;
     end;
   if schetnul=1 then   {если в строке только 1 ноль то}
   for j:=1 to n do  {проверяем соответствующий столбец}
    if n=i then      {и заменяем все 0 на 1 кроме одного}
    continue
    else
    begin
     x:=StrToFloat(tabl1.Cells[z,j]);
     if x=0 then
     tabl1.Cells[z,j]:=FloatToStr(1);
    end;
  end;
Almi вне форума Ответить с цитированием
Старый 12.11.2010, 21:04   #4
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Цитата:
Мне нужно чтобы в каждой строке и каждом столбце остался один ноль
Сразу б так

Ммм, смысл теперь понятен, но код уже не могу переварить) И у меня он вообще с ошибкой вылетает... Всё, спаааать!
tabl1.cells[2,3] := '0';

Последний раз редактировалось Риндера; 12.11.2010 в 21:06.
Риндера вне форума Ответить с цитированием
Старый 13.11.2010, 16:11   #5
Almi
 
Регистрация: 09.11.2010
Сообщений: 4
По умолчанию

У меня все компилится и считает, только вот этот отрывок не верный. вот полный код, мой вариант решения задачи о назначениях.
Вложения
Тип файла: txt Задача о назначениях.txt (2.6 Кб, 123 просмотров)
Almi вне форума Ответить с цитированием
Старый 26.11.2010, 16:29   #6
Avus
 
Регистрация: 18.11.2010
Сообщений: 3
По умолчанию

Almi, удалось ли реализовать вам данную программу?
Avus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивом monkey1631 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 19.04.2010 01:16
работа с массивом novi4ok_Delphi Помощь студентам 4 24.03.2010 20:28
работа с массивом Андрей.12 Помощь студентам 2 22.10.2009 00:25
Delphi, работа с массивом Skay Помощь студентам 2 05.04.2007 16:50