#include #include int solve(int cards[20], int number_of_cards); void remove_cards(int cards[20], int card1, int card2, int number_of_cards); int main() { #ifdef TARGET_RT_MAC_CFM FILE *stream = fopen("input", "r"); #else FILE *stream = stdin; #endif int number_of_puzzles; fscanf(stream, "%d", &number_of_puzzles); while (number_of_puzzles-- > 0) { int cards[20], index; for (index = 0; index < 20; index++) fscanf(stream, "%d", &cards[index]); printf("%d\n", solve(cards, 20)); } return 0; } int solve(int cards[20], int number_of_cards) { int saved_cards[20], index, result = number_of_cards, tmp; if (number_of_cards <= 0) return 0; memcpy(saved_cards, cards, sizeof(saved_cards)); for (index = 0; index < number_of_cards; index++) { if (index + 1 < number_of_cards && index % 4 != 3 && cards[index] == cards[index + 1]) { remove_cards(cards, index, index + 1, number_of_cards); tmp = solve(cards, number_of_cards - 2), result = (tmp < result ? tmp : result); if (result == 0) return 0; memcpy(cards, saved_cards, sizeof(saved_cards)); } if (index + 3 < number_of_cards && index % 4 != 0 && cards[index] == cards[index + 3]) { remove_cards(cards, index, index + 3, number_of_cards); tmp = solve(cards, number_of_cards - 2), result = (tmp < result ? tmp : result); if (result == 0) return 0; memcpy(cards, saved_cards, sizeof(saved_cards)); } if (index + 4 < number_of_cards && cards[index] == cards[index + 4]) { remove_cards(cards, index, index + 4, number_of_cards); tmp = solve(cards, number_of_cards - 2), result = (tmp < result ? tmp : result); if (result == 0) return 0; memcpy(cards, saved_cards, sizeof(saved_cards)); } if (index + 5 < number_of_cards && index % 4 != 3 && cards[index] == cards[index + 5]) { remove_cards(cards, index, index + 5, number_of_cards); tmp = solve(cards, number_of_cards - 2), result = (tmp < result ? tmp : result); if (result == 0) return 0; memcpy(cards, saved_cards, sizeof(saved_cards)); } } return result; } void remove_cards(int cards[20], int card1, int card2, int number_of_cards) { memmove(cards + card2, cards + card2 + 1, sizeof(int) * (number_of_cards - card2 - 1)); memmove(cards + card1, cards + card1 + 1, sizeof(int) * (number_of_cards - card1 - 2)); }