Задать вопрос
@William03

Почему ошибка ERROR C2678: ...?

При компиляции 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;
}
  • Вопрос задан
  • 3465 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
для map<Point, bool> и map<Point, long>
нужен пользовательский оператор
bool operator<(const Point& p1, const Point& p2)
{
  return (p1.x0 < p2.x0) && (p1.y0 < p2.y0);
}

Или
bool operator<(const Point& a, const Point& b) 
{
  return (a.x < b.x) || (a.y < b.y);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы