#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
struct Point2D {
int x,y;
bool operator==(const Point2D& rhs) const { return x==rhs.x && y==rhs.y; }
};
using Color = int;
struct Polygon{
vector<Point2D> vertex;
Color color;
};
ostream& operator<< (ostream& os, const Point2D& p) {
return os<<"("<<p.x<<","<<p.y<<")";
}
bool compare1(const vector<Point2D> &x, const vector<Point2D> &y ) {
return x==y;
}
bool compare2(const vector<Point2D> &x, const vector<Point2D> &y ) {
if (x.size() != y.size())
return false;
auto offset = find (y.cbegin(), y.cend(), x[0]); // asumes at least 1 point
if (offset==y.cend())
return false;
return equal(offset, y.cend(), x.cbegin())
&& equal(y.cbegin(), offset, x.cbegin()+(y.cend()-offset));
}
bool compare3(const vector<Point2D> &x, const vector<Point2D> &y ) {
if (x.size() != y.size())
return false;
auto offset = find (y.cbegin(), y.cend(), x[0]); // asumes at least 1 point
if (offset==y.cend()) // no point in commont
return false;
else if (equal(offset, y.cend(), x.cbegin())
&& equal(y.cbegin(), offset, x.cbegin()+(y.cend()-offset)))
return true;
// not equal. And in reverse order ?
auto roffset = make_reverse_iterator(offset+1);
return equal(roffset, y.crend(), x.cbegin())
&& equal(y.crbegin(), roffset, x.cbegin()+(y.crend()-roffset));
}
int main() {
vector<Polygon> v {
{ { {-1,0}, {0,1}, {1,0}, {0,-1}, {0,5}}, 105 },
{ { {-1,0}, {0,1}, {1,0}, {0,-1}}, 100 }, // same
{ { {0,1}, {1,0}, {0,-1}, {-1,0 }}, 101 }, // same but with diff starting
{ { {-1,0}, {0,-1}, {1,0}, {0,1}}, 102 }, // same in reverse order
{ { {0,-1}, {1,0}, {0,1}, {-1,0}}, 104 }, // same in revers with diff starting
{ { {-2,0}, {0,-2}, {2,0}, {0,2}}, 103 }
};
Polygon p { { {0,1}, {1,0}, {0,-1}, {-1,0 }}, 1110 };
auto f = find_if (v.begin(), v.end(), [&p](const auto &x) { return compare3(x.vertex, p.vertex); });
if (f!=v.end()) {
cout << "Found at "<< f-v.begin() <<endl;
}
else cout << "Not found";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgUG9pbnQyRCB7IAoJaW50IHgseTsgCglib29sIG9wZXJhdG9yPT0oY29uc3QgUG9pbnQyRCYgcmhzKSBjb25zdCB7IHJldHVybiB4PT1yaHMueCAmJiB5PT1yaHMueTsgfQp9Owp1c2luZyBDb2xvciA9IGludDsgCgpzdHJ1Y3QgUG9seWdvbnsKICAgdmVjdG9yPFBvaW50MkQ+IHZlcnRleDsKICAgQ29sb3IgY29sb3I7Cn07Cgpvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvcywgY29uc3QgUG9pbnQyRCYgcCkgewoJcmV0dXJuIG9zPDwiKCI8PHAueDw8IiwiPDxwLnk8PCIpIjsKfQoKYm9vbCBjb21wYXJlMShjb25zdCB2ZWN0b3I8UG9pbnQyRD4gJngsIGNvbnN0IHZlY3RvcjxQb2ludDJEPiAmeSApIHsKCXJldHVybiB4PT15OyAgCn0KYm9vbCBjb21wYXJlMihjb25zdCB2ZWN0b3I8UG9pbnQyRD4gJngsIGNvbnN0IHZlY3RvcjxQb2ludDJEPiAmeSApIHsKCWlmICh4LnNpemUoKSAhPSB5LnNpemUoKSkKCSAgICByZXR1cm4gZmFsc2U7IAoJYXV0byBvZmZzZXQgPSBmaW5kICh5LmNiZWdpbigpLCB5LmNlbmQoKSwgeFswXSk7ICAvLyBhc3VtZXMgYXQgbGVhc3QgMSBwb2ludCAKCWlmIChvZmZzZXQ9PXkuY2VuZCgpKSAKCSAgICByZXR1cm4gZmFsc2U7IAoJcmV0dXJuIGVxdWFsKG9mZnNldCwgeS5jZW5kKCksIHguY2JlZ2luKCkpIAoJICAgICAgICAgICYmIGVxdWFsKHkuY2JlZ2luKCksIG9mZnNldCwgeC5jYmVnaW4oKSsoeS5jZW5kKCktb2Zmc2V0KSk7ICAKfQpib29sIGNvbXBhcmUzKGNvbnN0IHZlY3RvcjxQb2ludDJEPiAmeCwgY29uc3QgdmVjdG9yPFBvaW50MkQ+ICZ5ICkgewoJaWYgKHguc2l6ZSgpICE9IHkuc2l6ZSgpKQoJICAgIHJldHVybiBmYWxzZTsgCglhdXRvIG9mZnNldCA9IGZpbmQgKHkuY2JlZ2luKCksIHkuY2VuZCgpLCB4WzBdKTsgIC8vIGFzdW1lcyBhdCBsZWFzdCAxIHBvaW50IAoJaWYgKG9mZnNldD09eS5jZW5kKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwb2ludCBpbiBjb21tb250CgkgICAgcmV0dXJuIGZhbHNlOyAKCWVsc2UgaWYgKGVxdWFsKG9mZnNldCwgeS5jZW5kKCksIHguY2JlZ2luKCkpIAoJICAgICAgICAgICYmIGVxdWFsKHkuY2JlZ2luKCksIG9mZnNldCwgeC5jYmVnaW4oKSsoeS5jZW5kKCktb2Zmc2V0KSkpCgkgICAgcmV0dXJuIHRydWU7ICAKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGVxdWFsLiAgQW5kIGluIHJldmVyc2Ugb3JkZXIgPyAKCWF1dG8gcm9mZnNldCA9IG1ha2VfcmV2ZXJzZV9pdGVyYXRvcihvZmZzZXQrMSk7CglyZXR1cm4gZXF1YWwocm9mZnNldCwgeS5jcmVuZCgpLCAgeC5jYmVnaW4oKSkKCSAgICAgICAgICAmJiBlcXVhbCh5LmNyYmVnaW4oKSwgcm9mZnNldCwgeC5jYmVnaW4oKSsoeS5jcmVuZCgpLXJvZmZzZXQpKTsKfQoKCmludCBtYWluKCkgewoJdmVjdG9yPFBvbHlnb24+IHYgewoJICAgIHsgeyB7LTEsMH0sIHswLDF9LCAgezEsMH0sICB7MCwtMX0sIHswLDV9fSwgMTA1IH0sCgkgICAgeyB7IHstMSwwfSwgezAsMX0sICB7MSwwfSwgIHswLC0xfX0sIDEwMCB9LAkgIC8vIHNhbWUKCSAgICB7IHsgezAsMX0sICB7MSwwfSwgIHswLC0xfSwgey0xLDAgfX0sIDEwMSB9LCAgLy8gc2FtZSBidXQgd2l0aCBkaWZmIHN0YXJ0aW5nCgkgICAgeyB7IHstMSwwfSwgezAsLTF9LCB7MSwwfSwgIHswLDF9fSwgMTAyIH0sICAgIC8vIHNhbWUgaW4gcmV2ZXJzZSBvcmRlcgoJICAgIHsgeyB7MCwtMX0sIHsxLDB9LCAgezAsMX0sIHstMSwwfX0sIDEwNCB9LCAgICAvLyBzYW1lIGluIHJldmVycyB3aXRoIGRpZmYgc3RhcnRpbmcKCSAgICB7IHsgey0yLDB9LCB7MCwtMn0sIHsyLDB9LCAgezAsMn19LCAxMDMgfQoJfTsKCQoJUG9seWdvbiBwIHsgeyB7MCwxfSwgIHsxLDB9LCAgezAsLTF9LCB7LTEsMCB9fSwgMTExMCB9OyAKCQoJYXV0byBmID0gZmluZF9pZiAodi5iZWdpbigpLCB2LmVuZCgpLCBbJnBdKGNvbnN0IGF1dG8gJngpIHsgcmV0dXJuIGNvbXBhcmUzKHgudmVydGV4LCBwLnZlcnRleCk7IH0pOwoJaWYgKGYhPXYuZW5kKCkpIHsKCQljb3V0IDw8ICJGb3VuZCBhdCAiPDwgZi12LmJlZ2luKCkgPDxlbmRsOyAKCX0KCWVsc2UgY291dCA8PCAiTm90IGZvdW5kIjsKCQoJcmV0dXJuIDA7Cn0=