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 :: Поиск элементов строк и столбцов в двумерном массиве

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
matt_xs
Отправлено: 25 Апреля, 2015 - 19:05:34
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


Добрый вечер, дорогие форумчане!
Имеется такая проблема. Мне необходима функция поиска элементов в двумерном массиве по строкам и столбцам таким образом:
Имеется изначальная матрица
PHP:
скопировать код в буфер обмена
  1.  
  2. $X = array(
  3.                         array(90,-1,20),
  4.                         array(-1,300,100),
  5.                         array(50,-1,60)
  6.                 );
  7.  

Идём по дв. массиву, пропуская -1, первый на пути элемент 90. Так вот, необходимо проверить если на этой строке, где 90, имеется хотя бы один элемент, не равный -1, и если на этом же столбце (где стоит 90), имеется хотя бы один элемент, не равный -1, то запомнить элемент 90 в новый двумерный массив $T, иначе, если на столбце есть, а строке нет, или наоборот, на строке есть, а на столбце нет, то приравнять элемент 90 в матрице $X к -1. Помогите, пожалуйста. Спасибо, большое, заранее!
 
 Top
dcc0
Отправлено: 25 Апреля, 2015 - 20:49:49
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Спойлер (Отобразить)


P.S.
Задач сформулирована плохо "иначе, если на столбце есть, а строке нет, или наоборот, на строке есть, а на столбце нет, то приравнять элемент 90 в матрице $X к -1"


Нет чего: "90", "-1"?

(Отредактировано автором: 25 Апреля, 2015 - 23:32:55)



-----
Март 2021. Бросил программирование
 
 Top
matt_xs
Отправлено: 26 Апреля, 2015 - 00:44:02
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


Если допустим
PHP:
скопировать код в буфер обмена
  1.  
  2. (90,-1,-1),
  3.  (-1,300,100),
  4. (-1,-1,60)
  5.  

Тогда 90 становится равно -1, а вот 100 запоминаем, так как на столбце и строке есть элементы не равные -1
А если
PHP:
скопировать код в буфер обмена
  1.  
  2. (90,-1,-1)
  3. (20,300,60)
  4. (-1,-1,100)
  5.  


то когда дойдем до 20, его тоже приравняем к -1, так как 90 стало -1 раньше и получилось, что на столбце у 20 нет элементов, неравных -1
 
 Top
dcc0
Отправлено: 26 Апреля, 2015 - 07:27:29
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Т.е. в если в строке или столбце есть хотя бы одно положительное число или именно -1?
Что если там -2?

Если массив всегда содержит три элемента, то можно эксплуатировать тот факт, что
произведение всех чисел в строке, где есть два отрицательных числа, будет положительным:
PHP:
скопировать код в буфер обмена
  1. if (current($x[0]) > 0  && in_array(-1, $x[0]) && array_product($x[0]) > 0)
  2.  

CUT

(Отредактировано автором: 26 Апреля, 2015 - 11:52:13)



-----
Март 2021. Бросил программирование
 
 Top
dcc0
Отправлено: 26 Апреля, 2015 - 14:16:44
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Можно для начала хотя бы просто посчитать количество -1 в каждой строке и столбце на каждой итерации и на основе этого сделать выводы, что делать дальше.

Если -1 в строке или столбце 2 раза, то осуществляется операция с массивом


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  
  4. $x = array(
  5.                         array(90,-1,-1),
  6.                         array(-1,300,100),
  7.                         array(-1,-1,60)
  8.                 );
  9. $arr_count=count($x);                          
  10.                
  11. $i=0;                          
  12. $a=-1;
  13.  
  14. while ($i!=$arr_count) {
  15.  
  16. $b=0;
  17.  
  18.  
  19.  
  20.    
  21.          foreach ($x[$i] as $v) {
  22.        
  23.          if ($v==$a) {
  24.  
  25. ++$b;
  26.        
  27.         }
  28. }
  29.  
  30. echo " -1 found for $b times in a line ";
  31.  
  32.  $b=0;
  33.  
  34.          foreach ($x as $val) {
  35.  
  36.          if ($val[$i]==$a) {
  37.  
  38. ++$b;
  39.  
  40.         }
  41. }
  42.  
  43. echo " -1 found for $b times in  a  column";
  44.  
  45. $i++;
  46. }
  47.  
  48.  
  49.  

(Добавление)
Мда, но даже так не совсем то, но тем не менее количество -1 в столбцах и строках мы определили.
Может быть, нужны ввести промежуточный массив.


(Добавление)
И да, всплывает вопрос, если

array(90,-1,-1),
array(-1,300,100),
array(-1,-1,60)
);
На первой строке и столбце только одно положительное число, то оно должно сразу поменяться или быть записано в какой-то промежуточный массив?

(Отредактировано автором: 26 Апреля, 2015 - 15:21:12)



-----
Март 2021. Бросил программирование
 
 Top
dcc0
Отправлено: 26 Апреля, 2015 - 17:49:49
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Я так и не смог составить алгоритм. Могу только порассуждать. Допустим, идем по всему массиву:
PHP:
скопировать код в буфер обмена
  1.  
  2.    for ($i=0; $i < 3; $i++) {
  3.                                
  4. foreach ($x[$i] as $v)  {
  5.                
  6. if($v!=1) ????
  7.                                
  8.   }
  9.                                        
  10. }
  11.  

Нашли число неравное -1, что тогда?
1. Проверить наличие положительных чисел в строке, т.е. в подмассиве (вероятно, только какой-то функцией для работы с массивами). Если есть положительные, то создать массив Т.
2. Если нет, вероятно, нужно запомнить число и запустить цикл по столбцу
3. Проверить не содержит этот же столбец -1 больше одного раза или искать положительное число.
Т.е. нужно для каждого числа в строке, в каждой строке, запускать цикл для столбца, считать кол-во -1 или проверять положительные или нет после чего еще, видимо, запускать функцию для изменений в массиве. Может, это должен быть какой-то рекурсивный алгоритм.
Получается, как-то много операций.


-----
Март 2021. Бросил программирование
 
 Top
matt_xs
Отправлено: 26 Апреля, 2015 - 18:04:42
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


Извините, что долго не отвечал. Массив изначальный Х может быть любых размеров, хоть 1000 на 1000. При этом там могут быть только положительные числа и 0. Надо пройтись по строке (исключая -1), если есть числа не равные -1 на строке и столбце (по отношению того, к которому ищем), то запоминаем это число, если нет, то приравнивании его к -1
 
 Top
matt_xs
Отправлено: 26 Апреля, 2015 - 20:21:22
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


Если такой случай
array(90,-1,-1),
array(-1,300,100),
array(-1,-1,60)
То здесь массив Х станет -1, так как ищем первый элемент, это 90, для него нет на строке и столбце чисел, не равных -1, то 90 становится -1 и идем по столбцу Х далее, там нет, переходим на новую строку, там 300, для него на строке есть 100, а на столбцах нет, значит 300 становится -1, далее 100, для 100 на строке нет чисел (300 мы приравняли к -1), значит его тоже к -1 и остается 60, с ним таже ситуация, ни на строке ни на столбце нет элементов, не равных -1.
 
 Top
dcc0
Отправлено: 27 Апреля, 2015 - 01:22:29
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Вообще у нас же квадратная матрица... но что этом на дает? Только то, что ее можно перевернуть...

Еще ход мысли: создадим два пустых массива, stolb и stroka.
1. Одним циклом идем по массиву.
2. Будем проверять, чему равно значение в строке, если не -1, то пишем в массив.
3. Тоже самое для столбца.
4. Получаем два массив со строкой и столбцом, которые хранят любые числа, но не -1,
(у нас в условии речь только о -1)
5. Завершаем цикл и начинаем проверку. Считаем количество значений в массивах,
если в stolb ИЛИ в stroka значений больше 1 - это означает, что число для которого осуществляли поиск, положительное. И помимо этого числа на столбце или строке есть еще число НЕРАВНОЕ - 1. Что и является, как я понимаю главным условием задачи.
Тогда выполняем требуем операции.


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $x = array(
  4.                         array(90,-1,-1),
  5.                         array(-1,300,100),
  6.                         array(-1,-1,60)
  7.                 );
  8.                                
  9.         $stolb=array();
  10.         $stroka=array();       
  11.         $i=0;
  12.  
  13.                 foreach ($x as $v)  {
  14.        
  15. if ($x[0][$i]!=-1) {
  16.         $stroka[$i]=$x[0][$i];
  17. }      
  18.        
  19. if ($v[0]!=-1) {
  20.         $stolb[$i]=$v[0];
  21.                                
  22.         }
  23.  
  24. $i++;
  25.  
  26. }
  27.  
  28.         if(( count($stolb) > 1)  || (count($stroka) > 1 )) {
  29.  
  30. echo "Создать массив Т";
  31.  
  32. }
  33.  
  34.  
  35.                              
  36.  
  37.  print_r($stolb);
  38. print_r($stroka);
  39.  
  40.  
  41.  
  42.  

Продолжение следует...

(Отредактировано автором: 27 Апреля, 2015 - 01:23:13)



-----
Март 2021. Бросил программирование
 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 01:29:38
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


Матрица не обязательно квадратная, произвольных размеров. Сейчас скоро выложу свой вариант
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 01:40:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




а у меня вот созрел вопрос, если матрица может быть любых размеров, то по какому критерию преобразовывать в -1, когда все остальные числа в ряду -1, или когда только два
числа -1?

например
20 -1 58 128 155
21 -1 -1 23 168
-1 50 10 100 -1
-1 20 -1 120 25

вот что должно получиться в таком вот случаи?
 
 Top
dcc0
Отправлено: 27 Апреля, 2015 - 02:04:47
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




exlant Хотя бы одно число (т.е два) на столбце или строке не - 1

20 не преобразовывается, так 155
20 -1 -1 -1 155
-1-1 -1 23 168
-1 50 10 100 -1
-1 20 -1 120 25


Преобразовывается
20 -1 -1 -1 -1
-1-1 -1 23 168
-1 50 10 100 -1
-1 20 -1 120 25

В случае с моим " ходом мысли " - преобразовывается в -1, если мы получили массивы для строки и столбца равные 1 (кол-во).
Если получили столбец или строку с 2 значениями, создаем массив $T
Иначе переходим к следующему значению.


-----
Март 2021. Бросил программирование
 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 02:23:34
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


dcc0 пишет:
Хотя бы одно число (т.е два) на столбце или строке не - 1

на строке И столбце хотя бы одно число, не равное -1.
20 -1 -1 -1 155
-1-1 -1 23 168
-1 50 10 100 -1
-1 20 -1 120 25
здесь 20 преобразовывается в -1
(Добавление)
Решил попробовать таким способом:
иду по матрице $x, если количество элементов (не равных -1) в строке и столбце >=2 и то запоминаю элемент $x[i][j], а если нет, то приравниваю его к -1, но что-то не получается..
PHP:
скопировать код в буфер обмена
  1.  
  2. function is_existELEM($X)
  3.         {
  4.                 $K = array();
  5.                 for ($q=0; $q < count($X); $q++) {
  6.                         for ($w=0; $w < count($X[0]); $w++) {
  7.                                 $K[$q][$w] = -1;
  8.                         }
  9.                 }
  10.  
  11.                 $as=0;
  12.                 $sa=0;
  13.  
  14.                 $s = false;
  15.                 $t = false;
  16.  
  17.                
  18.  
  19.                
  20.  
  21.                 for ($i=0; $i < count($X); $i++) {
  22.                         for ($j=0; $j < count($X[0]); $j++) {
  23.                                 if($X[$i][$j]==-1) continue;
  24.                                 else
  25.                                 {
  26.                                        
  27.                                
  28.                                                 for ($ki=$X[$i][0]; $ki < 1; $ki++) {
  29.                                                         for($kj=0;$kj<count($X[0]);$kj++)
  30.                                                         {
  31.                                                                 if($X[$ki][$kj]!=-1) $as++;
  32.                                                                 if($as >= 2) $s = true;
  33.                                                                 else $s = false;
  34.                                                         }
  35.                                                 }
  36.                                
  37.                                                 for ($ik=$X[$i][0]; $ik < count($X); $ik++) {
  38.                                                         for($jk=0;$jk<1;$jk++)
  39.                                                         {
  40.                                                                 if($X[$ik][$jk]!=-1) $sa++;
  41.                                                                 if($sa >= 2) $t = true;
  42.                                                                 else $t = false;
  43.                                                         }
  44.                                                 }
  45.                                
  46.  
  47.                                         if($s && $t) $K[$i][$j] = $X[$i][$j];
  48.                                         else $X[$i][$j]=-1;
  49.                                         printmatrix($X);
  50.                                         echo "<br><br>";
  51.                                 }
  52.                         }
  53.                 }
  54.                 return $K;
  55.         }
  56.  
  57.  
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 02:29:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




Цитата:
на строке И столбце
если на строке И столбце, то тут ничего не должно приравниваться -1, так как есть в строке 155...
(Добавление)
может все таки или, а не и??

(Отредактировано автором: 27 Апреля, 2015 - 02:30:16)

 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 02:31:49
Post Id


Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)

[+]


exlant пишет:
если на строке И столбце, то тут ничего не должно приравниваться -1, так как есть в строке 155...

а в столбце нету. Моя вина, я не написал, наверное, то, что число 20 мы не включаем в проверку. То есть проверяем кроме -1 и данного числа
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB