#include using namespace std; const bool CHECKFORTIES = false; struct tile { int n1, n2; bool used; bool horiz; int r, c; } tiles[21]; int indx[7][7]; int grid[5][5]; const int FULLHOUSE = 25; const int SMALLSTRAIGHT = 30; const int LARGESTRAIGHT = 40; int yScore = 50; void initTiles() { int k=0; for(int i=1; i<=6; i++) for(int j=i; j<=6; j++) { tiles[k].n1 = i; tiles[k].n2 = j; indx[i][j] = indx[j][i] = k; k++; } } int score(int v1, int v2, int v3, int v4, int v5) { int retval = 0; int count[7] = {0}; count[v1]++; count[v2]++; count[v3]++; count[v4]++; count[v5]++; for(int i=1; i<=6; i++) { if (count[i] == 5) { retval = yScore; yScore = 100; } else if (count[i] == 4) return 4*i; else if (count[i] == 3) { for(int j=1; j<=6; j++) if (count[j] == 2) return FULLHOUSE; return 3*i; } } if (count[2] >= 1 && count[3] >= 1 && count[4] >= 1 && count[5] >= 1) { if (count[1] >= 1 || count[6] >= 1) return LARGESTRAIGHT; else return SMALLSTRAIGHT; } else if (count[1] >= 1 && count[2] >= 1 && count[3] >= 1 && count[4] >= 1) return SMALLSTRAIGHT; else if (count[3] >= 1 && count[4] >= 1 && count[5] >= 1 && count[6] >= 1) return SMALLSTRAIGHT; return retval; } int gridScore() { yScore = 50; int total = 0; for(int i=0; i<5; i++) { total += score(grid[i][0], grid[i][1], grid[i][2], grid[i][3], grid[i][4]); total += score(grid[0][i], grid[1][i], grid[2][i], grid[3][i], grid[4][i]); } total += score(grid[0][0], grid[1][1], grid[2][2], grid[3][3], grid[4][4]); total += score(grid[0][4], grid[1][3], grid[2][2], grid[3][1], grid[4][0]); return total; } void advance(int& r, int& c) { while (grid[r][c] != 0) { if (++c == 5) { c = 0; r++; } } } int main() { int ncases; int n1, n2, m1, m2; cin >> ncases; initTiles(); for(int icase=1; icase<=ncases; icase++) { for(int i=0; i<21; i++) tiles[i].used = false; for(int i=0; i<5; i++) for(int j=0; j<5; j++) grid[i][j] = 0; int r=0, c=0; for(int i=0; i<13; i++) { char ch; int n1, n2; cin >> ch; if (ch == 'H') { cin >> n1 >> n2; int j = indx[n1][n2]; tiles[j].used = true; tiles[j].horiz = true; tiles[j].r = r, tiles[j].c = c; grid[r][c] = n1; grid[r][c+1] = n2; advance(r,c); } else if (ch == 'V') { cin >> n1 >> n2; int j = indx[n1][n2]; tiles[j].used = true; tiles[j].horiz = false; tiles[j].r = r, tiles[j].c = c; grid[r][c] = n1; grid[r+1][c] = n2; advance(r,c); } else { cin >> grid[r][c]; advance(r,c); } } int bestScore = gridScore(); n1 = -1, n2 = -1, m1 = -1, m2 = -1; for(int i=0; i<21; i++) { if (!tiles[i].used) continue; int r = tiles[i].r; int c = tiles[i].c; for(int j=0; j<21; j++) { if (!tiles[j].used) { if (tiles[i].horiz) { int s1 = grid[r][c]; int s2 = grid[r][c+1]; grid[r][c] = tiles[j].n1; grid[r][c+1] = tiles[j].n2; int score = gridScore(); //cout << "replace " << s1 << ',' << s2 << " with " << tiles[j].n1 << ',' << tiles[j].n2 << ", score = " << score << endl; if (score > bestScore) { bestScore = score; n1 = s1; n2 = s2; m1 = tiles[j].n1; m2 = tiles[j].n2; } else if (CHECKFORTIES && score == bestScore) cout << "tie: score = " << score << endl; if (tiles[j].n1 != tiles[j].n2) { grid[r][c] = tiles[j].n2; grid[r][c+1] = tiles[j].n1; score = gridScore(); //cout << "replace " << s1 << ',' << s2 << " with " << tiles[j].n2 << ',' << tiles[j].n1 << ", score = " << score << endl; if (score > bestScore) { bestScore = score; n1 = s1; n2 = s2; m1 = tiles[j].n2; m2 = tiles[j].n1; } else if (CHECKFORTIES && score == bestScore) cout << "tie: score = " << score << endl; } grid[r][c] = s1; grid[r][c+1] = s2; } else { int s1 = grid[r][c]; int s2 = grid[r+1][c]; grid[r][c] = tiles[j].n1; grid[r+1][c] = tiles[j].n2; int score = gridScore(); //cout << "replace " << s1 << ',' << s2 << " with " << tiles[j].n1 << ',' << tiles[j].n2 << ", score = " << score << endl; if (score > bestScore) { bestScore = score; n1 = s1; n2 = s2; m1 = tiles[j].n1; m2 = tiles[j].n2; } else if (CHECKFORTIES && score == bestScore) cout << "tie: score = " << score << endl; if (tiles[j].n1 != tiles[j].n2) { grid[r][c] = tiles[j].n2; grid[r+1][c] = tiles[j].n1; score = gridScore(); //cout << "replace " << s1 << ',' << s2 << " with " << tiles[j].n2 << ',' << tiles[j].n1 << ", score = " << score << endl; if (score > bestScore) { bestScore = score; n1 = s1; n2 = s2; m1 = tiles[j].n2; m2 = tiles[j].n1; } else if (CHECKFORTIES && score == bestScore) cout << "tie: score = " << score << endl; } grid[r][c] = s1; grid[r+1][c] = s2; } } } } cout << "Case " << icase << ": " << bestScore << endl; //cout << " " << n1 << ' ' << n2 << ' ' << m1 << ' ' << m2 << endl; } }