#include<iostream>
#include<set>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int size = 10;//game size
const int times = 10;
const int partyN = 18;
//time , size
int partyBoard[times][size][2] = { 0 };//0 is empty
bool usedParty[times][partyN+1];//1~18, party in this time
bool playedGame[partyN+1][size];//has this party played this game?
set< pair<int, int> > vs;//party vs party
void init()
{
for (int i = 0; i < times; i++)
{
for (int j = 0; j < size; j++)
{
partyBoard[i][j][0] = 0;
partyBoard[i][j][1] = 0;
}
for (int j = 0; j < partyN+1; j++)
{
usedParty[i][j] = false;
playedGame[j][i] = false;
}
}
}
void show()
{
for (int i = 0; i < times; i++)
{
for (int j = 0; j < size; j++)
{
if (i != 1)
printf(" ");
printf("(%2d,%2d) ", partyBoard[i][j][0], partyBoard[i][j][1]);
}
printf("\n");
}
}
//x is game
//y is time
bool backTrack(int x, int y, int r)
{
// show();
if (x == size)
{
if (r==0)
return backTrack(0, y + 1, partyN);
else
return false;
}
if (y == times)
{
return true;
}
for (int i = 1; i < partyN + 1; i++)
for (int j = i + 1; j < partyN + 1; j++)
{
if (usedParty[y][i] == false && usedParty[y][j] == false)//time, party
if (playedGame[i][x] == false && playedGame[j][x] == false)//party, game
if (vs.count(make_pair(i,j))==0)
{
//push
partyBoard[y][x][0] = i;
partyBoard[y][x][1] = j;
usedParty[y][i] = true;
usedParty[y][j] = true;
playedGame[i][x] = true;
playedGame[j][x] = true;
vs.insert(make_pair(i, j));
if (backTrack(x+1,y,r-2))
{
return true;
}
//pop
partyBoard[y][x][0] = 0;
partyBoard[y][x][1] = 0;
usedParty[y][i] = false;
usedParty[y][j] = false;
playedGame[i][x] = false;
playedGame[j][x] = false;
vs.erase(make_pair(i, j));
}
}
//skip game
if (size-1-x>=r/2)
if (backTrack(x+1,y,r))
return true;
return false;
}
int main(int argc, char* argv[])
{
cout << backTrack(0, 0, 18) << endl;
show();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RkbGliPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgc2l6ZSA9IDEwOy8vZ2FtZSBzaXplCmNvbnN0IGludCB0aW1lcyA9IDEwOwpjb25zdCBpbnQgcGFydHlOID0gMTg7Ci8vdGltZSAsIHNpemUKaW50IHBhcnR5Qm9hcmRbdGltZXNdW3NpemVdWzJdID0geyAwIH07Ly8wIGlzIGVtcHR5CmJvb2wgdXNlZFBhcnR5W3RpbWVzXVtwYXJ0eU4rMV07Ly8xfjE4LCBwYXJ0eSBpbiB0aGlzIHRpbWUKYm9vbCBwbGF5ZWRHYW1lW3BhcnR5TisxXVtzaXplXTsvL2hhcyB0aGlzIHBhcnR5IHBsYXllZCB0aGlzIGdhbWU/CnNldDwgcGFpcjxpbnQsIGludD4gID4gdnM7Ly9wYXJ0eSB2cyBwYXJ0eQoKdm9pZCBpbml0KCkKewoJCglmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzOyBpKyspCgl7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspCgkJewoJCQlwYXJ0eUJvYXJkW2ldW2pdWzBdID0gMDsKCQkJcGFydHlCb2FyZFtpXVtqXVsxXSA9IDA7CgkJfQoJCWZvciAoaW50IGogPSAwOyBqIDwgcGFydHlOKzE7IGorKykKCQl7CgkJCXVzZWRQYXJ0eVtpXVtqXSA9IGZhbHNlOwoJCQlwbGF5ZWRHYW1lW2pdW2ldID0gZmFsc2U7CgkJfQoJfQp9CgoKdm9pZCBzaG93KCkKewoKCWZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykKCXsKCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykKCQl7CgkJCWlmIChpICE9IDEpCgkJCQlwcmludGYoIiAiKTsKCgkJCXByaW50ZigiKCUyZCwlMmQpICIsIHBhcnR5Qm9hcmRbaV1bal1bMF0sIHBhcnR5Qm9hcmRbaV1bal1bMV0pOwoKCQl9CgkJcHJpbnRmKCJcbiIpOwoJfQp9CgovL3ggaXMgZ2FtZQovL3kgaXMgdGltZQpib29sIGJhY2tUcmFjayhpbnQgeCwgaW50IHksIGludCByKQp7CQovLwlzaG93KCk7CglpZiAoeCA9PSBzaXplKQoJewoJCWlmIChyPT0wKQoJCQlyZXR1cm4gYmFja1RyYWNrKDAsIHkgKyAxLCBwYXJ0eU4pOwoJCWVsc2UKCQkJcmV0dXJuIGZhbHNlOwoJfQoJaWYgKHkgPT0gdGltZXMpCgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoKCWZvciAoaW50IGkgPSAxOyBpIDwgcGFydHlOICsgMTsgaSsrKQoJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcGFydHlOICsgMTsgaisrKQoJewoJCWlmICh1c2VkUGFydHlbeV1baV0gPT0gZmFsc2UgJiYgdXNlZFBhcnR5W3ldW2pdID09IGZhbHNlKS8vdGltZSwgcGFydHkKCQlpZiAocGxheWVkR2FtZVtpXVt4XSA9PSBmYWxzZSAmJiBwbGF5ZWRHYW1lW2pdW3hdID09IGZhbHNlKS8vcGFydHksIGdhbWUKCQlpZiAodnMuY291bnQobWFrZV9wYWlyKGksaikpPT0wKQoJCXsKCQoKCQkJLy9wdXNoCgkJCXBhcnR5Qm9hcmRbeV1beF1bMF0gPSBpOwoJCQlwYXJ0eUJvYXJkW3ldW3hdWzFdID0gajsKCQkJdXNlZFBhcnR5W3ldW2ldID0gdHJ1ZTsKCQkJdXNlZFBhcnR5W3ldW2pdID0gdHJ1ZTsKCQkJcGxheWVkR2FtZVtpXVt4XSA9IHRydWU7CgkJCXBsYXllZEdhbWVbal1beF0gPSB0cnVlOwoJCQl2cy5pbnNlcnQobWFrZV9wYWlyKGksIGopKTsKCgkJCWlmIChiYWNrVHJhY2soeCsxLHksci0yKSkKCQkJewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCS8vcG9wCgkJCXBhcnR5Qm9hcmRbeV1beF1bMF0gPSAwOwoJCQlwYXJ0eUJvYXJkW3ldW3hdWzFdID0gMDsKCQkJdXNlZFBhcnR5W3ldW2ldID0gZmFsc2U7CgkJCXVzZWRQYXJ0eVt5XVtqXSA9IGZhbHNlOwoJCQlwbGF5ZWRHYW1lW2ldW3hdID0gZmFsc2U7CgkJCXBsYXllZEdhbWVbal1beF0gPSBmYWxzZTsKCQkJdnMuZXJhc2UobWFrZV9wYWlyKGksIGopKTsKCQl9Cgl9CgoJLy9za2lwIGdhbWUKCWlmIChzaXplLTEteD49ci8yKQoJaWYgKGJhY2tUcmFjayh4KzEseSxyKSkKCQlyZXR1cm4gdHJ1ZTsKCglyZXR1cm4gZmFsc2U7Cn0KCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewoKCWNvdXQgPDwgYmFja1RyYWNrKDAsIDAsIDE4KSA8PCBlbmRsOwoKCXNob3coKTsKCXJldHVybiAwOwp9Cgo=