При компиляции Visual Studio выдает ошибку:
error C2678: бинарный "<": не найден оператор, принимающий левый операнд типа "const _Ty" (или приемлемое преобразование отсутствует).
Что это значит и как ее исправить?
P.S. Если данные пояснения помогут, то вот они:
Структура Shape - прямоугольник, первые две координаты у которого (x0, y0) - левая нижняя его вершина, вторые две
(x1, y1) - правая верхняя. Вершины прямоугольника лежат в узлах
целочисленной решетки.
Структура
Point - точка хранит координаты точки x0, y0.
Функция
PointInShape проверяет, лежит ли точка в прямоугольнике.
Функция
PointInArea проверяет, лежит ли точка в каком-нибудь из прямоугольников, а также посещали ли мы ее ранее.
Вектор
shapes - набор прямоугольников
Словарь
used хранит информацию, посещена ли вершина point.
Словарь
dist хранит расстояния до вершин от стартовой.
Во входном файле задано количество прямоугольников n и в следующих n строках заданы прямоугольники в виде
координат левой нижней и правой верхней вершин.
В последних двух строках заданы координаты стартовой и конечной вершин.
Разрешено посещать только те вершины, которые находятся хотя бы в одном из многоугольников.
Ходить можно только
конем, как в шахматах (на две клетки вверх/вниз и на одну в перпендикулярном направлении).
Необходимо вывести в выходной файл расстояние
length между вершинами или -1, если между ними нет пути.
Пример входных данных:
3
0 0 2 2
1 2 4 2
4 1 6 3
0 0
1 1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <fstream>
#include <queue>
using namespace std;
struct Shape {
long x0, y0, x1, y1;
explicit Shape(const long X0, const long Y0, const long X1, const long Y1) {
x0 = X0;
y0 = Y0;
x1 = X1;
y1 = Y1;
}
};
struct Point {
long x0, y0;
explicit Point(const long X0,const long Y0) {
x0 = X0;
y0 = Y0;
}
};
bool PointInShape(const Shape& shape,const Point& point) {
if (point.x0 >= shape.x0 && point.x0 <= shape.x1 &&
point.y0 >= shape.y0 && point.y0 <= shape.y1) return true;
return false;
}
bool PointInArea(const vector <Shape>& sh, const map <Point, bool>& u,const Point& point) {
bool InUsed = u.count(point);
for (const Shape& s : sh) {
if (PointInShape(s, point) && !InUsed) return true;
}
return false;
}
int main() {
ifstream file_in("infile.txt");
ofstream file_out("outfile.txt");
long n;
file_in >> n;
long x1, y1, x2, y2;
vector <Shape> shapes;
map <Point, bool> used;
map <Point, long> dist;
for (int i = 0; i < n; ++i) {
file_in >> x1 >> y1 >> x2 >> y2;
shapes.push_back(Shape( x1, y1, x2, y2 ));
}
file_in >> x1 >> y1 >> x2 >> y2;
const Point start(x1, y1);
const Point end(x2, y2);
queue <Point> points;
points.push(start);
dist[start] = 0;
long length = -1;
while (!points.empty()) {
Point point = points.front();
points.pop();
for (const Point& p : {Point(point.x0+2, point.y0+1),
Point(point.x0+2, point.y0-1),
Point(point.x0+1, point.y0+2),
Point(point.x0-1, point.y0-2)}) {
if (p.x0 == end.x0 && p.y0 == end.y0) {
length = dist[point] + 1;
file_out << length;
return 0;
}
else {
if (PointInArea(shapes, used, p)) {
points.push(p);
dist[p] = dist[point] + 1;
}
}
}
}
file_out << length;
return 0;
}