ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

05.11.2007, 02:09
|
|
Участник форума
Регистрация: 08.11.2006
Сообщений: 208
Провел на форуме: 1038169
Репутация:
184
|
|
Сообщение от RedBull@12
у етбя такие массивы
massiv1[x] и massiv2[y]
где X = 0...X, ну или что-то типа того
а Y = 0...Y, ну или похожее
так?
нет,
массивы генерируются так:
PHP код:
function GetPlos($mas)
{
$r=0;
$res=(($mas[3]-$mas[1])*($mas[2]-$mas[0]));
for ($i=$mas[0];$i<$mas[2];$i++)
{
for ($j=$mas[1];$j<$mas[3];$j++)
{
$m[$i][$j]=true;
}
}
return $m;
}
$mfile=file('prams.txt');
$arr=array();
for ($i=0;$i<count($mfile);$i++)
{
$mas=explode(' ',$mfile[$i]);
//$arr=$arr+GetPlos($mas);
//print_r(GetPlos($mas)); echo '<br>';
GetPlos($mas);// вот эта функция возвращает массивы.
}
в файле
имеется 2 прямоугольника. один полностью закрыт другим (начало в 0,0, заканчивается один в 2,2 другой в 3,3 (коодинаты ссотв..))
надо сделать так чтобы не перечислялись два раза те которые имеют общие точки..
|
|
|

05.11.2007, 02:33
|
|
Участник форума
Регистрация: 06.11.2006
Сообщений: 129
Провел на форуме: 482261
Репутация:
58
|
|
MegaDeth, ответ 13?
|
|
|

05.11.2007, 02:42
|
|
Участник форума
Регистрация: 08.11.2006
Сообщений: 208
Провел на форуме: 1038169
Репутация:
184
|
|
Сообщение от RedBull@12
MegaDeth, ответ 13?
мм... вообщето должно получится 9... в данном случе..
если так то прямоугольник разширится до 4х3 что будет = 12... вообщем дрянь дело нада придумывать другой алгоритм...
для удобства взял начало обеих прямоугольников с начала координат то не всегда так...
|
|
|

05.11.2007, 03:49
|
|
Участник форума
Регистрация: 06.11.2006
Сообщений: 129
Провел на форуме: 482261
Репутация:
58
|
|
Сообщение от MegaDeth
мм... вообщето должно получится 9... в данном случе..
Хм...судя по выводу массива,пересчитал сумму всех вложенных массивов у меня получилось 13(4 в первом случаи и 9 во втором)
аа...почитал немного вкурил..что-то сразу не понял...
Тогда тут вроде алгоритм не так составлен, или второй варинат - я сново не вкурил
------------
|***|##|
|***|##|
|***|##|
|#####|
|#####|
------------
Тебе какую область нудн получить? */#?
если * то в данном случи у нас полуится 2*2=4
|***|
|***|
|***|
если # то - (3*3)-(2*2)=5
------------
|##|
|##|
|##|
|#####|
|#####|
------------
9 никак не получается,только есть взять площадь большего прямоугольника.
13 получается при сложении...
------------------
|#####|***|
|#####|***|
|#####|***|
|#####|
|#####|
-------------
Какой тебе вариант нужно получить?(конечно можно еще перемножить их и т.д.)
Последний раз редактировалось RedBull@12; 05.11.2007 в 07:01..
|
|
|

05.11.2007, 10:57
|
|
Участник форума
Регистрация: 08.11.2006
Сообщений: 208
Провел на форуме: 1038169
Репутация:
184
|
|
нее.. вообщем в файл пишется - координаты левой нижней точки прямоугольника затем координаты правой верхней точки. в строку. 4 числа. строк может быть много. надо посчитать площадь всех прямоугольников, но в случае наслоения площадь наслоения (те участки где они наслоились) должна учитватся только 1 раз...
вот у тя 13 получилось один прямоугольник 2*2=4 другой 3*3=9
9+4=13 НО один полностью закрыт другим
и его площадь учитывать ненадо.
***
??*
??*
Последний раз редактировалось MegaDeth; 05.11.2007 в 11:11..
|
|
|

05.11.2007, 12:59
|
|
Участник форума
Регистрация: 08.11.2006
Сообщений: 208
Провел на форуме: 1038169
Репутация:
184
|
|
решение было просто до ужоса. мож кому пригодится...
PHP код:
<?php
$m=array();
$r=0;
function GetPlos($mas)
{
GLOBAL $m,$r;
$res=(($mas[3]-$mas[1])*($mas[2]-$mas[0]));
for ($i=$mas[0];$i<$mas[2];$i++)
{
for ($j=$mas[1];$j<$mas[3];$j++)
{
if (!isset($m[$i][$j])) {
$m[$i][$j]=true; $r++; }
}
}
return $m;
}
$mfile=file('prams.txt');
$arr=array();
for ($i=0;$i<count($mfile);$i++)
{
$mas=explode(' ',$mfile[$i]);
GetPlos($mas);
}
echo $r;
?>
RedBull@12, большое спасибо что пытался помоч...
Последний раз редактировалось MegaDeth; 05.11.2007 в 13:04..
|
|
|

05.11.2007, 13:44
|
|
Участник форума
Регистрация: 06.11.2006
Сообщений: 129
Провел на форуме: 482261
Репутация:
58
|
|
MegaDeth, честно не вкурил.
Твой скрипт отгда не работает у него во всех значениях получается 1...а в последних по любому должно быть часть нулей
Код:
Array (
--------[0] => Array (
-------------------------[0] => 1
-------------------------[1] => 1
--------)
--------[1] => Array (
-------------------------[0] => 1
-------------------------[1] => 1
--------)
)
Array (
---------[0] => Array (
--------------------------[0] => 1
--------------------------[1] => 1
--------------------------[2] => 1
--------)
---------[1] => Array (
--------------------------[0] => 1
--------------------------[1] => 1
--------------------------[2] => 1
--------) [2] => Array (
--------------------------[0] => 1
--------------------------[1] => 1
--------------------------[2] => 1
--------)
)
=>наш скрипт написан не верно.
иначе нет вообще смысла в этом скрипте
Последний раз редактировалось RedBull@12; 05.11.2007 в 14:03..
|
|
|

05.11.2007, 14:31
|
|
Участник форума
Регистрация: 08.11.2006
Сообщений: 208
Провел на форуме: 1038169
Репутация:
184
|
|
неее, все как надо работает.
вот сам попробуй в файл тхт запиши
0 0 2 4
0 0 3 3
потом написуй на бумаге по клеткам два прямоугольника левый нижний угол - в нач. координат, правый верхний одного - (2,4) второго - (3,3).
эти два прямоугольника будут занимать площадь 11 клеток. скрипт выдает праавду )))
|
|
|

05.11.2007, 16:31
|
|
Участник форума
Регистрация: 06.11.2006
Сообщений: 129
Провел на форуме: 482261
Репутация:
58
|
|
Сообщение от MegaDeth
неее, все как надо работает.
вот сам попробуй в файл тхт запиши
0 0 2 4
0 0 3 3
потом написуй на бумаге по клеткам два прямоугольника левый нижний угол - в нач. координат, правый верхний одного - (2,4) второго - (3,3).
эти два прямоугольника будут занимать площадь 11 клеток. скрипт выдает праавду )))
Так про что и речь тут мы складываем два массива.
Сейасч напишу скрипт,елси получится
|
|
|

05.11.2007, 17:13
|
|
Участник форума
Регистрация: 06.11.2006
Сообщений: 129
Провел на форуме: 482261
Репутация:
58
|
|
MegaDeth, смотри алгоритм,ну который я могу предположить, но пока у меня пробелмы с реализацией:
1-Вычисляем максимальную длину прямоугольника.
1111111
1111111
0000000
0000000
2-Вычисляем максимальную ширину прямоугольника.
1100000
1100000
1100000
1100000
3-Создаем двумерный массив[длина][ширина], все элеменеты в массиве имеют значение 0.
по идеи у нас должно получиться что-то типа вот этого:
0000000
0000000
0000000
0000000
4-Далее заполняем/складываем по очереди все прямоугольнки с нашим нулевым массивом.
и унас получится что-то типа вот этого:
1111111
1111111
1100000
1100000
5-Дальше смотрим сколько у нас значений TRUE(1). через элелентарный цикл.
Ну походу это то что ты хотел получить, полагаю что это не совсем рационально,но елси данный цикл процедура выполняется не слишком часто и нет ограничения по памяти то оптимальный вариант.
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|