Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Поиск элементов строк и столбцов в двумерном массиве [2]
Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015
Помог: 14 раз(а)
все-равно не понял!
ладно, возьмем самый первый пример
(90,-1,-1),
(-1,300,100),
(-1,-1,60)
здесь 90 не трогаем, так как первое число?
300 не трогаем, так как есть 100
100 не трогаем, так как есть 300, и 60
60 не трогаем так как есть 100? (Добавление)
или же мы просто именно 20 не трогаем?
тогда в данном случаи меняется только 90 на -1?
matt_xs
Отправлено: 27 Апреля, 2015 - 02:42:38
Новичок
Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014
Помог: 0 раз(а)
[+]
exlant пишет:
все-равно не понял!
ладно, возьмем самый первый пример
(90,-1,-1),
(-1,300,100),
(-1,-1,60)
здесь 90 не трогаем, так как первое число?
300 не трогаем, так как есть 100
100 не трогаем, так как есть 300, и 60
60 не трогаем так как есть 100?
Нет,здесь так.
Идём по этой матрице, первый не -1 элемент это 90. Смотрим, есть ли кроме -1 и его самого (90) в строке и столбце элементы, если есть, то запоминаем, но в данном примере нет,поэтому 90 становится -1. Далее 300, для него(кроме -1 и его самого) есть 10 на строке, а на столбце нет элементов, поэтому 300 становится -1. Далее 100, т.к. для 100 (кроме -1 и его самого) есть только на столбце 60, а на строке нет (300 мы на предыдущем шаге приравняли к -1), то 100 становится -1. И далее остаётся 60,для него ни на строке ни на столбце нет элементов (кроме -1 и его самого),следна выъоде получается дв массив, где одни -1
exlant
Отправлено: 27 Апреля, 2015 - 02:48:43
Посетитель
Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015
Помог: 14 раз(а)
значит все таки если хотя бы в строке, ИЛИ столбце все -1, кроме проверяемого числа, то его приравниваем к -1!
matt_xs
Отправлено: 27 Апреля, 2015 - 02:53:49
Новичок
Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014
Помог: 0 раз(а)
[+]
Понял вас)
Да, если в столбце или строке все -1, кроме проверяемого, то присваиваем к -1!
Чуть не запутался сам) (Добавление)
если в столбце или строке все элементы равны -1, кроме проверяемого, то присваиваем к -1!
exlant
Отправлено: 27 Апреля, 2015 - 06:02:08
Посетитель
Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015
Помог: 14 раз(а)
вроде работает так как надо...
хотя все это лучше бы в класс запихнуть!
Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014
Помог: 0 раз(а)
[+]
Ух, она идеально работает! Только если матрица не квадратная, то выскакивает ошибка
Notice: Undefined offset: 3 in
на вот этой строке counting($array[$y][$a],$stack['x']);
или на вот этой counting($array[$a][$x],$stack['y']);
Спасибо, огромное! (Добавление)
Теперь осталось сделать "малость": (Добавление)
необходимо задать координаты (i,j) (позицию в матрице Х). И от этого числа (которое с этими координатами - оно не равно -1 никогда) начать выполнять процедуру поиска в строке и столбце. И продолжать до тех пор, пока не дойдём до этого числа. При этом надо запоминать, где чётные, а где нечётные запоминания. То есть, например,
для неё вводим координаты (0,2) - это элемент 20. (Координаты вводятся всегда только тех чисел, которые не -1, то есть мы заранее знаем, какая у нас исходная матрица.)
Элемент 20. Для него проверяем - на строке (кроме него и -1) есть 90, на столбце 100 и 60, значит запоминаем его так же и при этом запоминаем, что это нечётное число (так как оно первое, которое мы нашли). Идём далее, число 300, для него столбец пустой, поэтому оно становится -1. Далее 100. На строке тоже только -1 (300 приравняли к -1 на предыдущем шаге), значит 100 тоже становится -1. Далее 50. Для 50 на строке (кроме него и -1) есть 60, на столбце 90, значит запоминаем 50 и при этом запоминаем, что это чётное число (так как оно второе, которое нам подходит). Далее 60 - для него (кроме него и -1) на строке 50, на столбце 20, значит запоминаем и запоминаем, что оно нечётное. Далее 90,проверяем (кроме него и -1) на строке есть 20, на столбце 50, следовательно, 90 запоминаем и запоминаем, что оно чётное число (по счёту которое мы нашли). Далее доходим до 20 и понимаем,что пришли в начальную точку и обрываем цикл. После того, как мы всё нашли, надо из "чётных чисел" (у нас это 90 и 60) выбрать минимальное (min(90,60)) и прибавить это минимальное число (в данном случае 60) к тем числам, которые считаются "нечётными" и вычесть у тех, который считаются "чётными". То есть в нашем случае: изначальная матрица была:
$X = array(
array(90,-1,20),
array(-1,300,100),
array(50,-1,60)
);
И так как у нас 20 и 50 нечётные, а 90 и 60 чётные, то мы ищем min(90,60). Прибавляем 60 к 50 и 20, и вычитаем 60 у 90 и 60 и на выходе получаем
$X = array(
array(30,-1,80),
array(-1,300,100),
array(110,-1,0)
);
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Помог: 10 раз(а)
Часть вторая. Похоже, получилось. По крайне мере очень близко. Я пока удалил все, что связано с проверкой того - что хранится в промежуточных массивах.
Идея такая:
1. Перебираем весь массив по ключам. Двумя циклами, так как массив вложенный.
Для каждого значения запускаем функцию с именем second.
2. Передаем значения ключей из первого цикла и из второго, чтобы указать, в каком
столбце или строке искать. Первый ключ $ka, понятное дело, передается три раза,
так как мы ищем во всей строке для каждого значения. (в предыдущей версии мы двигались по диагонали). Легко проверить, так как мы получили 9 вариантов (столько и должно быть).
Вроде бы правильно, остается добавить проверку значений в промежуточных массивах
и операции над массивом X и T.
Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015
Помог: 14 раз(а)
Цитата:
Только если матрица не квадратная, то выскакивает ошибка
Скиньте, но массив где вылазит ошибка!
Я изначально планировал, что б все работало с прямоугольными матрицами! Ошибок у меня не было.. (Добавление)
И я пошел другим путем, мой алгоритм не запоминает числа, когда в ряду есть -1, но их не хватает, что бы поменять число на -1!
В моем варианте, если была хоть одна замена на -1, то запускаем цикл проверки по массиву еще раз. А для сокращения итераций, запоминаем x или y, столбца или строки в которых все -1, и в итерации пропускаем их! Я посчитал, что такой алгоритм лучше, чем запоминать числа, когда в ряду не все -1!
dcc0
Отправлено: 27 Апреля, 2015 - 13:06:31
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014
Помог: 0 раз(а)
[+]
exlant пишет:
Скиньте, но массив где вылазит ошибка!
Считает всё правильно, но ошибка есть. Но е1ё мождно и убрать с помощью @
Строка 134: counting($array[$y][$a],$stack['x']); (Добавление)
Я думал над вариантом:
$odd=0; // Переменная, которая отвечает за чётность и нечётность найденных элементов
задаём i,j
идём в $X[$i][$j].
Ставим odd++;
далее переходим к следующему, если оно нам подходит, но снова odd++; и так до тех пор, пока мы не пришли снова к числу, от которого стартовали (с $i, $j).
Потом если (odd%2)==0, то есть чётные числа, то min(массив чётных)
потом в самой матрице $X к нечётным прибавляем этот минимум, у чётных вычитаем. И всё в do while, так как стартуем не с начала матрицы, а с заданных i, j Прикреплено изображение (Нажмите для увеличения)
exlant
Отправлено: 27 Апреля, 2015 - 13:44:00
Посетитель
Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015
Помог: 14 раз(а)
м-да, пропустил! только заметил, что ошибки у меня были не все включены!
вот так переделайте:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.