{ {Point (0,0), 0}, {Point(2,1), 1} }
- так и должно быть. Но дальше, когда нашлась{ {Point(0, 0), 0}, {Point(2, 1), 1}, {Point(4, 2), 2} }
dist[p] = dist[point] + 1
в словаре dist происходят странные и загадочные вещи.#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <fstream>
#include <queue>
using namespace std;
// Structures
struct Point {
long x, y;
explicit Point() { }
explicit Point(const long x0, const long y0) {
x = x0;
y = y0;
}
};
struct Shape {
Point left;
Point right;
explicit Shape(const Point& l, const Point& r) {
left = l;
right = r;
}
};
// Operators
bool operator == (const Point& a, const Point& b) {
return ((a.x == b.x) && (a.y == b.y));
}
bool operator >= (const Point& a, const Point& b) {
return ((a.x >= b.x) && (a.y >= b.y));
}
bool operator <= (const Point& a, const Point& b) {
return ((a.x <= b.x) && (a.y <= b.y));
}
bool operator < (const Point& a, const Point& b) {
return ((a.x < b.x) && (a.y < b.y));
}
// Functions
bool PointInShape(const Shape& shape,const Point& point) {
if (point >= shape.left && point <= shape.right) return true;
return false;
}
bool PointInArea(const vector <Shape>& sh,const vector <Point>& u,const Point& point) {
bool InUsed = count(u.begin(), u.end(), point);
for (const Shape& s : sh) {
if (PointInShape(s, point) && !InUsed) return true;
}
return false;
}
// HELP PRINTER
void PrintDist(const map <Point, long> d) {
for (const auto& p : d) {
cout << "Point: " << p.first.x << " " << p.first.y << " is " << p.second << endl;
}
}
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;
vector <Point> used;
map <Point, long> dist;
for (int i = 0; i < n; ++i) {
file_in >> x1 >> y1 >> x2 >> y2;
shapes.push_back(Shape( Point (x1, y1), Point(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();
used.push_back(point);
for (const Point& p : {Point(point.x+2, point.y+1),
Point(point.x+2, point.y-1),
Point(point.x-2, point.y+1),
Point(point.x-2, point.y-1),
Point(point.x+1, point.y+2),
Point(point.x-1, point.y+2),
Point(point.x+1, point.y-2),
Point(point.x-1, point.y-2)}) {
if (p == end) {
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;
}
Этот код компилируется, все хорошо. В словаре
map <Point, long> d{ {Point(1,2), 12} }
только один объект Point. Первый запрос, очевидно, должен выдать 1. Так и произошло. Но точекPoint(1, -123), Point(4314, 2)
нет в словаре. Однако запрос о их наличии выдает 1.Только точка
Point(6, 6)
отсутствует в словаре (верный ответ на запрос - 0), потому что ни одна из ее координат не совпадает с координатами той точки, которая находится в словаре(
Point(6, 6) != Point(1, 2)
). Пожалуйста объясните, почему так происходит.