#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>
using namespace std;
struct Piece {
int idx;
int left;
int right;
};
bool operator<( const Piece & a, const Piece & b ) {
if ( a.left < b.left ) return true;
if ( a.left > b.left ) return false;
if ( a.right < b.right ) return true;
if ( a.right > b.right ) return false;
return false;
}
const Piece findPiece( const std::vector< Piece > & v, const Piece & p ) {
return *std::find_if( v.begin(), v.end(), [ p ]( const Piece & i ) {
return p.idx == i.idx;
} );
}
int main() {
std::vector< Piece > dominos = {
{ 1, 1, 2 },
{ 2, 2, 4 },
{ 3, 2, 4 },
{ 4, 6, 4 },
{ 5, 2, 1 }
};
std::vector< Piece > dominosCopy{ dominos };
bool all = false;
std::vector< std::vector< Piece > > allPerm;
do {
allPerm.emplace_back( dominos.begin(), dominos.end() );
} while ( std::next_permutation( dominos.begin(), dominos.end() ) );
const int count = dominos.size();
int goodPerm;
for ( int perm = 0, size = allPerm.size(); perm < size && ! all; perm++ ) {
bool ok = true;
std::vector< Piece > & d = allPerm[ perm ];
for ( int i = 1; i < count && ok; i++ ) {
//cout << "( " << d[ i - 1 ].idx << " ) [ " << d[ i - 1 ].left << " " << d[ i - 1 ].right << " ] ";
if ( d[ i ].left == d[ i - 1 ].right || d[ i ].right == d[ i - 1 ].right ) {
if ( d[ i ].right == d[ i - 1 ].right ) {
std::swap( d[ i ].left, d[ i ].right );
}
}
else {
ok = false;
}
}
//cout << "( " << d[ count - 1 ].idx << " ) [ " << d[ count - 1 ].left << " " << d[ count - 1 ].right << " ]" << endl;
if ( ok ) {
goodPerm = perm;
all = true;
}
}
if ( all ) {
for ( const Piece & p : allPerm[ goodPerm ] ) {
const Piece pCopy = findPiece( dominosCopy, p );
cout << p.idx << " " << ( ( pCopy.left == p.left ) ? "+" : "-" );
cout << " [ " << pCopy.left << " " << pCopy.right << " ]" << endl;
}
}
else {
cout << "No solution" << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBQaWVjZSB7CglpbnQgaWR4OwoJaW50IGxlZnQ7CglpbnQgcmlnaHQ7Cn07Cgpib29sIG9wZXJhdG9yPCggY29uc3QgUGllY2UgJiBhLCBjb25zdCBQaWVjZSAmIGIgKSB7CglpZiAoIGEubGVmdCA8IGIubGVmdCApIHJldHVybiB0cnVlOwoJaWYgKCBhLmxlZnQgPiBiLmxlZnQgKSByZXR1cm4gZmFsc2U7CglpZiAoIGEucmlnaHQgPCBiLnJpZ2h0ICkgcmV0dXJuIHRydWU7CglpZiAoIGEucmlnaHQgPiBiLnJpZ2h0ICkgcmV0dXJuIGZhbHNlOwoJcmV0dXJuIGZhbHNlOwp9Cgpjb25zdCBQaWVjZSBmaW5kUGllY2UoIGNvbnN0IHN0ZDo6dmVjdG9yPCBQaWVjZSA+ICYgdiwgY29uc3QgUGllY2UgJiBwICkgewoJcmV0dXJuICpzdGQ6OmZpbmRfaWYoIHYuYmVnaW4oKSwgdi5lbmQoKSwgWyBwIF0oIGNvbnN0IFBpZWNlICYgaSApIHsKCQlyZXR1cm4gcC5pZHggPT0gaS5pZHg7Cgl9ICk7Cn0KCmludCBtYWluKCkgewoJc3RkOjp2ZWN0b3I8IFBpZWNlID4gZG9taW5vcyA9IHsKCQl7IDEsIDEsIDIgfSwKCQl7IDIsIDIsIDQgfSwKCQl7IDMsIDIsIDQgfSwKCQl7IDQsIDYsIDQgfSwKCQl7IDUsIDIsIDEgfQoJfTsKCXN0ZDo6dmVjdG9yPCBQaWVjZSA+IGRvbWlub3NDb3B5eyBkb21pbm9zIH07Cglib29sIGFsbCA9IGZhbHNlOwoJc3RkOjp2ZWN0b3I8IHN0ZDo6dmVjdG9yPCBQaWVjZSA+ID4gYWxsUGVybTsKCWRvIHsKCQlhbGxQZXJtLmVtcGxhY2VfYmFjayggZG9taW5vcy5iZWdpbigpLCBkb21pbm9zLmVuZCgpICk7Cgl9IHdoaWxlICggc3RkOjpuZXh0X3Blcm11dGF0aW9uKCBkb21pbm9zLmJlZ2luKCksIGRvbWlub3MuZW5kKCkgKSApOwoJY29uc3QgaW50IGNvdW50ID0gZG9taW5vcy5zaXplKCk7CglpbnQgZ29vZFBlcm07Cglmb3IgKCBpbnQgcGVybSA9IDAsIHNpemUgPSBhbGxQZXJtLnNpemUoKTsgcGVybSA8IHNpemUgJiYgISBhbGw7IHBlcm0rKyApIHsKCQlib29sIG9rID0gdHJ1ZTsKCQlzdGQ6OnZlY3RvcjwgUGllY2UgPiAmIGQgPSBhbGxQZXJtWyBwZXJtIF07CgkJZm9yICggaW50IGkgPSAxOyBpIDwgY291bnQgJiYgb2s7IGkrKyAgKSB7CgkJCS8vY291dCA8PCAiKCAiIDw8IGRbIGkgLSAxIF0uaWR4IDw8ICIgKSBbICIgPDwgZFsgaSAtIDEgXS5sZWZ0IDw8ICIgIiA8PCBkWyBpIC0gMSBdLnJpZ2h0IDw8ICIgXSAgICAiOwoJCQlpZiAoIGRbIGkgXS5sZWZ0ID09IGRbIGkgLSAxIF0ucmlnaHQgfHwgZFsgaSBdLnJpZ2h0ID09IGRbIGkgLSAxIF0ucmlnaHQgKSB7CgkJCQlpZiAoIGRbIGkgXS5yaWdodCA9PSBkWyBpIC0gMSBdLnJpZ2h0ICkgewoJCQkgIAkJc3RkOjpzd2FwKCBkWyBpIF0ubGVmdCwgZFsgaSBdLnJpZ2h0ICk7CgkJCQl9CgkJCX0KCQkJZWxzZSB7CgkJCQlvayA9IGZhbHNlOwoJCQl9CgkJfQoJCS8vY291dCA8PCAiKCAiIDw8IGRbIGNvdW50IC0gMSBdLmlkeCA8PCAiICkgWyAiIDw8IGRbIGNvdW50IC0gMSBdLmxlZnQgPDwgIiAiIDw8IGRbIGNvdW50IC0gMSBdLnJpZ2h0IDw8ICIgXSIgPDwgZW5kbDsKCQlpZiAoIG9rICkgewoJCQlnb29kUGVybSA9IHBlcm07CgkJCWFsbCA9IHRydWU7CgkJfQoJfQoJaWYgKCBhbGwgKSB7CgkJZm9yICggY29uc3QgUGllY2UgJiBwIDogYWxsUGVybVsgZ29vZFBlcm0gXSApIHsKCQkJY29uc3QgUGllY2UgcENvcHkgPSBmaW5kUGllY2UoIGRvbWlub3NDb3B5LCBwICk7CgkJCWNvdXQgPDwgcC5pZHggPDwgIiAiIDw8ICggKCBwQ29weS5sZWZ0ID09IHAubGVmdCApID8gIisiIDogIi0iICk7CgkJCWNvdXQgPDwgIiAgWyAiIDw8IHBDb3B5LmxlZnQgPDwgIiAiIDw8IHBDb3B5LnJpZ2h0IDw8ICIgXSIgPDwgZW5kbDsKCQl9Cgl9CgllbHNlIHsKCQljb3V0IDw8ICJObyBzb2x1dGlvbiIgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9