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]

 PHP.SU

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


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

> Без описания
exlant
Отправлено: 27 Апреля, 2015 - 02:35:16
Post Id



Посетитель


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


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




все-равно не понял!
ладно, возьмем самый первый пример
(90,-1,-1),
(-1,300,100),
(-1,-1,60)
здесь 90 не трогаем, так как первое число?
300 не трогаем, так как есть 100
100 не трогаем, так как есть 300, и 60
60 не трогаем так как есть 100?
(Добавление)
или же мы просто именно 20 не трогаем?
тогда в данном случаи меняется только 90 на -1?
 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 02:42:38
Post Id


Новичок


Покинул форум
Сообщений всего: 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
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 02:48:43
Post Id



Посетитель


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


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




значит все таки если хотя бы в строке, ИЛИ столбце все -1, кроме проверяемого числа, то его приравниваем к -1!
 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 02:53:49
Post Id


Новичок


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


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

[+]


Понял вас)
Да, если в столбце или строке все -1, кроме проверяемого, то присваиваем к -1!
Чуть не запутался сам)
(Добавление)
если в столбце или строке все элементы равны -1, кроме проверяемого, то присваиваем к -1!
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 06:02:08
Post Id



Посетитель


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


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




вроде работает так как надо...
хотя все это лучше бы в класс запихнуть!
PHP:
скопировать код в буфер обмена
  1.  
  2. $X = array(
  3.        array(1,-1,3,10,3),
  4.        array(4,-1,-1,10,-1),
  5.        array(-1,-1,-1,10,-1),
  6.        array(-1,-1,1,10,-1),
  7.        array(1,2,3,10,-1),
  8.        array(4,-1,-1,10,-1),
  9.        array(-1,-1,-1,-1,10),
  10.        array(-1,-1,1,-1,-1)
  11.        
  12.    );
  13.    
  14.     echo "<table border=1>";
  15.     foreach ($X as $y => $array){
  16.             echo "<tr>";
  17.             foreach($array as $x => $val){
  18.                 $style = '';
  19.                 if($val === -1) {$val = '<b>'.$val.'</b>'; $style = ';background-color:green';}
  20.                 echo "<td style='width:30px;text-align:center",$style,"'>",$val,"</td>";
  21.             }
  22.             echo "</tr>";
  23.     }
  24.     echo "</table>";
  25.    
  26.    $count_row = count($X);  // считаем сколько рядов
  27.    $count_column = count($X[0]); //считаем сколько столбцов
  28.    $count = ($count_row > $count_column) ? $count_row : $count_column; // выбираем, то чего у нас само больше
  29.    
  30.    $column = array();  // массив куда будем записывать столбцы, где все -1
  31.    $row = array();  // массив куда будем записывать колонки, где все -1
  32.    
  33.     function counting($val,&$num){
  34.         if($val){
  35.             if($val === -1){
  36.                 $num++;
  37.             }
  38.         }
  39.     }
  40.    
  41.     function search($array, $count, $x, $y){
  42.         $stack = array('x' => 0, 'y' => 0); //сюда записываем количество чисел с -1 в столбце и ряду
  43.         $success = FALSE;
  44.         global $count_row;
  45.         global $count_column;
  46.         global $column;
  47.         global $row;
  48.         for($a = 0; $a < $count; $a++){
  49.             counting($array[$y][$a],$stack['x']);
  50.             counting($array[$a][$x],$stack['y']);
  51.         }
  52.         if($count_column === $stack['x']+1){
  53.             $row[] = $y; // номер ряда со всеми -1
  54.             $success = TRUE;
  55.         }
  56.            
  57.         if($count_row === $stack['y']+1){
  58.             $column[] = $x;// номер столбца со всеми -1
  59.             $success = TRUE;
  60.         }
  61.         if($success)
  62.             return TRUE;
  63.         return FALSE;
  64.    }
  65.    
  66.     for($num = 0;;$num = 0){   // цикл работает пока хоть раз была замена числа на -1
  67.         foreach ($X as $y => $array){
  68.             if(in_array($y, $row)) continue; // если столбец со всеми -1, выходим с итерации
  69.                    
  70.             foreach($array as $x => $val){
  71.                 if(in_array($x, $column)) continue; // если ряд со всеми -1, выходим с итерации
  72.                      
  73.                 if($val!==-1){
  74.                     if(search($X, $count, $x, $y)){ // если в ряду, или столбце все числа -1, кроме этого
  75.                         $X[$y][$x] = -1;
  76.                         $num++;
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.         if($num == 0) break; // обрываем цикл, если не было замены на -1
  82.     }
  83.    
  84.     echo "<br><table border=1>";
  85.     foreach ($X as $y => $array){
  86.             echo "<tr>";
  87.             foreach($array as $x => $val){
  88.                 $style = '';
  89.                 if($val === -1) {$val = '<b>'.$val.'</b>'; $style = ';background-color:green';}
  90.                 echo "<td style='width:30px;text-align:center",$style,"'>",$val,"</td>";
  91.             }
  92.             echo "</tr>";
  93.     }
  94.     echo "</table>";
  95.  

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

 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 11:05:45
Post Id


Новичок


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


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

[+]


Ух, она идеально работает! Только если матрица не квадратная, то выскакивает ошибка
Notice: Undefined offset: 3 in
на вот этой строке counting($array[$y][$a],$stack['x']);
или на вот этой counting($array[$a][$x],$stack['y']);
Спасибо, огромное!
(Добавление)
Теперь осталось сделать "малость":
(Добавление)
необходимо задать координаты (i,j) (позицию в матрице Х). И от этого числа (которое с этими координатами - оно не равно -1 никогда) начать выполнять процедуру поиска в строке и столбце. И продолжать до тех пор, пока не дойдём до этого числа. При этом надо запоминать, где чётные, а где нечётные запоминания. То есть, например,

Берем исходную
$X = array(
array(90,-1,20),
array(-1,300,100),
array(50,-1,60)
);

для неё вводим координаты (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)
);

После прохода мы получили такую:

$X = array(
array(90,-1,20),
array(-1,-1,-1),
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)
);

(Отредактировано автором: 27 Апреля, 2015 - 11:39:03)

 
 Top
dcc0
Отправлено: 27 Апреля, 2015 - 12:00:27
Post Id


Участник


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


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




Часть вторая. Похоже, получилось. По крайне мере очень близко. Я пока удалил все, что связано с проверкой того - что хранится в промежуточных массивах.

Идея такая:
1. Перебираем весь массив по ключам. Двумя циклами, так как массив вложенный.
Для каждого значения запускаем функцию с именем second.
2. Передаем значения ключей из первого цикла и из второго, чтобы указать, в каком
столбце или строке искать. Первый ключ $ka, понятное дело, передается три раза,
так как мы ищем во всей строке для каждого значения. (в предыдущей версии мы двигались по диагонали). Легко проверить, так как мы получили 9 вариантов (столько и должно быть).
Вроде бы правильно, остается добавить проверку значений в промежуточных массивах
и операции над массивом X и T.


CUT.

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



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



Посетитель


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


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




Цитата:
Только если матрица не квадратная, то выскакивает ошибка

Скиньте, но массив где вылазит ошибка!
Я изначально планировал, что б все работало с прямоугольными матрицами! Ошибок у меня не было..
(Добавление)
И я пошел другим путем, мой алгоритм не запоминает числа, когда в ряду есть -1, но их не хватает, что бы поменять число на -1!

В моем варианте, если была хоть одна замена на -1, то запускаем цикл проверки по массиву еще раз. А для сокращения итераций, запоминаем x или y, столбца или строки в которых все -1, и в итерации пропускаем их! Я посчитал, что такой алгоритм лучше, чем запоминать числа, когда в ряду не все -1!
 
 Top
dcc0
Отправлено: 27 Апреля, 2015 - 13:06:31
Post Id


Участник


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


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




CUT

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



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


Новичок


Покинул форум
Сообщений всего: 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
Прикреплено изображение (Нажмите для увеличения)
Безымянный.png
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 13:44:00
Post Id



Посетитель


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


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




м-да, пропустил! только заметил, что ошибки у меня были не все включены!
вот так переделайте:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($array[$y][$a]) and $array[$y][$a] === -1){
  3.                 $stack['x']++;
  4.             }
  5.             if(isset($array[$a][$x]) and $array[$a][$x] === -1){
  6.                 $stack['y']++;
  7.             }
  8.  

а это вообще удалить
PHP:
скопировать код в буфер обмена
  1.  
  2. function counting($val,&$num){
  3.         if($val){
  4.             if($val === -1){
  5.                 $num++;
  6.             }
  7.         }
  8.     }
  9.  
 
 Top
matt_xs
Отправлено: 27 Апреля, 2015 - 13:55:51
Post Id


Новичок


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


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

[+]


Переделал, спасибо! Осталось реализовать сложение у нечётных и вычитание у чётных, стартуя с определённой позиции. Сижу, разбираюсь с этим моментом
 
 Top
dcc0
Отправлено: 27 Апреля, 2015 - 14:12:10
Post Id


Участник


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


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




CUT

(Отредактировано автором: 27 Апреля, 2015 - 18:49:22)



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


Участник


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


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




exlant, да, круто получилось у тебя, и без разницы, сколько элементов в массиве.


-----
Март 2021. Бросил программирование
 
 Top
exlant
Отправлено: 27 Апреля, 2015 - 19:11:04
Post Id



Посетитель


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


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




dcc0 спасибо) так и планировалось!
 
 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