Количество точек в прямоугольнике

134
30 августа 2019, 04:10

Линейный массив A содержит 2*N элементов, значения которых задаются по следующей формуле a[i]:=10*sin(N+i*i). Элементы массива нумеруются с единицы.

Найти количество точек, расположенных внутри прямоугольника, заданного координатами вершин одной из диагоналей, если значения элементов А[1] и А[2] - координаты первой точки, элементов А[3] и А[4] - второй точки и т. д. Стороны прямоугольника параллельны соответствующим осям системы координат.

Во входном потоке в первой строке дано натурально N (N <= 100), во второй строке через пробел даны четыре целых числа - координаты вершин диагонали прямоугольника X1 Y1 X2 Y2 (-15 < X1, X2, Y1, Y2 < 15) например: 54 -8 10 7 4 например: 13

Привожу пример кода, онлайн-проверку не проходит. Прошу указать на что-то явное, что я упускаю.

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n,size,x1,y1,x2,y2,q=0;
  cin >> n >> x1 >> y1 >> x2 >> y2;
  size=2*n+1;
  float arr[size];
  for (int i=1;i<size;i++)
  {
  arr[i]=10*sin(n+i*i);
  }
  for (int i=1;i<size;i+=2)
  {
    if ((arr[i] > x1 && arr[i] < x2 && arr[i+1] < y1 && arr[i+1] > y2) ||
      (arr[i] < x1 && arr[i] > x2 && arr[i+1] > y1 && arr[i+1] < y2 ))q++;
  }
  cout << q;
  return 0;
}
Answer 1

Ваша проверка в if рассматривает только одно положение диагонали (причем "альтернативное") - между левым-верхним и правым-нижним углом. Но в условии не сказано, что диагональ проходит именно так. Возможна и диагональ между левым-нижним и правым-верхним углом.

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

Но вместо того, чтобы городить многовариантный if, лучше бы вам сразу нормализовать прямоугольник

std::tie(x1, x2) = std::minmax({ x1, x2 });
std::tie(y1, y2) = std::minmax({ y1, y2 });

и далее пользоваться простым if

if (arr[i] > x1 && arr[i] < x2 && arr[i+1] > y1 && arr[i+1] < y2)
  ++q;

Как уже не раз говорилось, такого

float arr[size];

в С++ нет.

READ ALSO
Запись текста в std::string дважды. С++

Запись текста в std::string дважды. С++

Допустим у меня есть std::string strХочу ввести с клавиатуры текст, который скопируется в str

125
QT Vector QAction

QT Vector QAction

Стоит перед мной задача:

135
Как превратить map&lt;String,String&gt; в объект класса?

Как превратить map<String,String> в объект класса?

Есть map описывающий сущность, где пара это имя поля и его значениеПодскажите пожалуйста, есть ли какой нибудь инструмент который позволит...

141
break выход из цикла или всё-таки

break выход из цикла или всё-таки

break - выбрасывает вас из цикла либо же ключевое слово которое выходит из циклаЗавершить цикл раньше времени и тд

162