#include<iostream> #include<set> #include<cstdio> #include<cstdlib> using namespace std; const int size = 10;//game size const int times = 9; 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; }
zero
1 ( 1, 2) ( 3, 4) ( 5, 6) ( 7, 8) ( 9,10) (11,12) (13,14) (15,16) (17,18) ( 0, 0) ( 3, 5) ( 1, 6) ( 2, 4) ( 9,11) ( 7,12) ( 8,10) (15,17) (13,18) (14,16) ( 0, 0) ( 4, 6) ( 2, 5) ( 1, 3) (10,12) ( 8,11) ( 7, 9) (16,18) (14,17) (13,15) ( 0, 0) ( 7,10) ( 8, 9) (11,13) ( 1, 4) ( 2,14) (15,18) ( 3, 6) ( 5,12) ( 0, 0) (16,17) ( 8,12) ( 7,11) ( 9,14) ( 2,15) ( 1,16) (13,17) ( 4, 5) ( 3,10) ( 0, 0) ( 6,18) ( 9,13) (10,14) ( 7,15) ( 3,17) ( 4,18) ( 2,16) ( 1, 8) ( 0, 0) ( 6,12) ( 5,11) (11,17) ( 0, 0) ( 8,18) ( 5,16) ( 3,13) ( 4,14) ( 9,12) ( 2, 6) ( 1, 7) (10,15) (14,15) (12,18) (10,16) ( 6,13) ( 5,17) ( 0, 0) ( 2, 7) ( 1, 9) ( 3,11) ( 4, 8) ( 0, 0) (13,16) (12,17) (14,18) ( 6,15) ( 1, 5) (10,11) ( 4, 7) ( 2, 8) ( 3, 9)