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

    @William03 Автор вопроса
    Roman, хорошо, поставим вопрос немного иначе.
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <map>
    using namespace std;
    
    // Structures
    
    struct Point {
    	long x;
    	long y;
    	explicit Point(const long& x0, const long& y0) {
    		x = x0;
    		y = y0;
    	}
    };
    
    // Operators
    
    bool operator < (const Point& a, const Point& b) {
    	return ((a.x < b.x) && (a.y < b.y));
    }
    
    
    
    int main() {
    	map <Point, long> d{ {Point(1,2), 12} };
    	cout << (d.find(Point(1, 2)) != end(d)) << endl;
    	cout << (d.find(Point(1, -123)) != end(d)) << endl;
    	cout << (d.find(Point(4314, 2)) != end(d)) << endl;
    	cout << (d.find(Point(6, 6)) != end(d)) << endl;
    	system("pause");
    	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)). Пожалуйста объясните, почему так происходит.
  • Почему ошибка ERROR C2678: ...?

    @William03 Автор вопроса
    Все происходит примерно так:
    Из вершины (0, 0) видим доступную - (2, 1). В словаре такой нет, все хорошо. Словарь после итерации:
    { {Point (0,0), 0}, {Point(2,1), 1} } - так и должно быть. Но дальше, когда нашлась
    доступная вершина (1, 2), она оказывается найденной в dist, причем dist[Point(1, 2)] = 1.
    Затем переходим к вершине (2, 1) и начинаем просматривать ребра из нее. Первая доступная вершина -
    (4, 2). Ее в словаре нет (так и должно быть), заносим ее в словарь. Теперь словарь выглядит так:
    { {Point(0, 0), 0}, {Point(2, 1), 1}, {Point(4, 2), 2} }

    Отлично. Теперь видим доступную вершину (0, 2) и оказывается, что она уже присутствует в словаре.
    Не понимаю, что может быть не так.
  • Почему ошибка ERROR C2678: ...?

    @William03 Автор вопроса
    Немного поменял код (теперь есть vector used и в shape 2 объекта - точки). Правда есть проблема: когда я пишуdist[p] = dist[point] + 1 в словаре dist происходят странные и загадочные вещи.
    Сначала все нормально, но иногда там почему-то переписываются старые значения вместо добавления новых и т.п.. Извиняюсь за то, что так настойчив - я совсем новичок в C++ и пытаюсь разобраться. Спасибо за помощь!
    #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;
    }
  • Почему ошибка ERROR C2678: ...?

    @William03 Автор вопроса
    А где можно подробнее изучить о тех пользовательских операторах, о которых вы первоначально упомянули?
  • Почему ошибка ERROR C2678: ...?

    @William03 Автор вопроса
    Кажется, я понял. В C++ операторы автоматические определены для встроенных типов, но для созданных их нужно определять самостоятельно. Как тогда посчитать кол-во вхождений point в u?
    bool InUsed = u.count(point);
  • Компоненты связности; обход графа в глубину?

    @William03 Автор вопроса
    6/11 тестов. Но спасибо и за это решение. Я все равно его буду разбирать.
  • Компоненты связности; обход графа в глубину?

    @William03 Автор вопроса
    Вопрос в том, что за ошибка может быть. До меня не доходит. Ведь матрица же есть, dfs корректный вроде.
  • Как сократить время выполнения данной программы (Python)?

    @William03 Автор вопроса
    Это конечно все замечательно, но:
    - Здесь нет функций, которые можно задать с помощью lambda.
    - Функция zip соединяет списки, здесь это не нужно.
    - Функция map проводит операции либо со всеми элементами списка, либо в срезе, но во 2-ом
    варианте функция будет возвращать так же срез. Будет иметь смысл дополнять этот срез до
    полного исходного списка, если можно просто воспользоваться другой функцией (func_1 в моем случае)?
  • Как сократить время выполнения данной программы (Python)?

    @William03 Автор вопроса
    > Если Python ...
    Другая версия
    > "return S" в func_1 не имеет смысла ...
    Не очень понял. Если не имеет смысла, тогда как иначе?
    > можете попробовать numpy ...
    Нельзя, программа тестируется на Yandex.Contest.
  • Как сократить время выполнения данной программы (Python)?

    @William03 Автор вопроса
    Переделал, все равно выдает тайм лимит.
    func_1(int(In[1]),int(In[2]),int(In[3]),A)
    func_1(int(In[1]),int(In[2]),int(In[3]),B)
    # вместо присваивания
  • Как "корректно" обрабатывать концы строк?

    @William03 Автор вопроса
    КУДА? Скинь мне нормальный код, мне нужна не идея, мне нужен просто работающий код. Откуда мне знать, как ты мыслишь? Просто дай нормальный код и все.
  • Как "корректно" обрабатывать концы строк?

    @William03 Автор вопроса
    Не работает. Просто фиаско, ты проверял вообще? Если task.in весил 42 байта, то после твоего бесконечного цикла 28.5 МБ.
  • Как "корректно" обрабатывать концы строк?

    @William03 Автор вопроса
    Не заметил твои отступы. Ну даже если без них, что такое i? Выдает ошибку, не распознает i.