Основной пункт здесь - проверка видимости. Определенная точка (x, y)
видна (px, py)
, если на линии нет объектов (px, py) - (x, y)
. Объекты могут находиться только на целочисленных позициях. Поэтому мы должны проверять каждую точку, лежащую на этой линии.
..................
. o
. x
. x
. x
. x
. p
Предположим, что мы хотим, чтобы проверить видимость o
от p
. Сначала мы должны вычислить разницу. В этом случае o
- dx=15
единиц права и dy=5
единиц, превышающих p
. Объекты могут находиться только на определенных позициях. Возможные положения распределяются по линии с равным расстоянием. Количество точек определяется наибольшим общим делителем dx
и dy
(поскольку оба значенияи dy
должны быть целыми числами). Gcd 5 и 15 - 5. Таким образом, мы должны проверить 5 возможных позиций (помечены x
). stepX = dx/gcd = 15/5 = 3
и stepY = dy/gcd = 5/5 = 1
. Последний пункт - o
, поэтому нам не нужно это проверять.
Мы можем определить функцию для проверки видимости, что делает что-то вроде следующего (в предположении, что существует gcd
функция):
bool isVisible(int** matrix /*or any other appropriate declaration */, int px, int py, int ox, int oy)
{
int dx = ox - px;
int dy = oy - py;
int div = gcd(abs(dx), abs(dy));
int stepX = dx/div;
int stepY = dy/div;
for(int i = 1; i < div; ++i)
{
int checkX = px + i * stepX; //these could be computed incrementally
int checkY = py + i * stepY;
if (matrix[checkX][checkY] == 2) //blocked
return false;
}
return true;
}
Обратите внимание, что эта функция является иллюстрацией и не может быть функциональным.
Если вы построили матрицу и знаете координаты p
, тогда вам нужно только перебрать каждую позицию. Вызовите вышеуказанную функцию с положением, чтобы проверить, видно ли это и увеличивать счетчик, если это так. Пропустите p
в процессе.
Вот еще один пример, когда более очевидно, что требуется gcd. dx = 16
, dy = 12
..................
. o
.
.
. x
.
.
. x
.
.
. x
.
.
.p
Я не понимаю. Можете ли вы объяснить, в чем проблема: что вы ожидаете увидеть и что видите вместо этого, какие ошибки вы получаете и т. Д. Используете ли вы отладчик? – Drop
Можете ли вы просмотреть другие объекты? В каких направлениях вы можете смотреть (только горизонтальные, вертикальные, диагональные, произвольные)? –
нет, вот в чем дело, вы не можете видеть сквозь объекты, вы можете посмотреть в любом направлении – Bogdan