#include #define IndexToX(index) ((index)%4) #define IndexToY(index) ((index)/4) #define PositionToIndex(x,y) ((x)+((y)*4)) int makeRemovedCards(int c1, int c2, int oldCards[20], int newCards[20]) { int i, j, leftCards; for (i = j = 0; i < 20 && oldCards[i] > 0; i++) { if (i == c1 || i == c2) { continue; } newCards[j] = oldCards[i]; j++; } leftCards = j; for (; j < 20; j++) { newCards[j] = -1; } return leftCards; } int recursiveRemove(int oldCards[20], int minCards) { int i, j, newCards[20]; static int dx[4] = {1, -1, 0, 1}; static int dy[4] = {0, 1, 1, 1}; for (i = 0; i < 20; i++) { if (oldCards[i] < 0) { break; } for (j = 0; j < 4; j++) { if (IndexToX(i) + dx[j] >= 0 && IndexToX(i) + dx[j] <= 3 && IndexToY(i) + dy[j] <= 4) { int neighborIndex = PositionToIndex(IndexToX(i) + dx[j], IndexToY(i) + dy[j]); if (oldCards[i] == oldCards[neighborIndex]) { int leftCards; leftCards = makeRemovedCards(i, neighborIndex, oldCards, newCards); if (minCards > leftCards) { minCards = leftCards; } leftCards = recursiveRemove(newCards, minCards); if (leftCards == 0) { return 0; } if (minCards > leftCards) { minCards = leftCards; } } } } } return minCards; } int main() { int N; int I, i; int cards[20]; scanf("%d", &N); for (I = 0; I < N; I++) { for (i = 0; i < 20; i++) { scanf("%d", &cards[i]); } printf("%d\n", recursiveRemove(cards, 20)); } return 0; }