#include #include #include #include using namespace std; const unordered_map ranks = { {'2', 0}, {'3', 1}, {'4', 2}, {'5', 3}, {'6', 4}, {'7', 5}, {'8', 6}, {'9', 7}, {'X', 8}, {'A', 9}, {'J', 10}, {'Q', 11}, {'K', 12}}; const unordered_map suits = { {'C', 0}, {'D', 1}, {'H', 2}, {'S', 3}}; int card_id (char rank, char suit) { return ranks.at(rank)*4 + suits.at(suit); } bool DFS(const unordered_set & cards, vector used, int from, int distance) { used[from] = true; if (distance == (int)(cards.size() - 1)) return true; //cout << "from " << from ; for (int i = from % 4; i < 52; i+= 4 ) { if (i!=from) { if ((cards.find(i)!=cards.end()) && (!used[i]) ) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1)) return true; } } } for (int i = from - from % 4; i < from - from % 4 + 4; i ++ ) { if (i!=from) { if ((cards.find(i)!=cards.end()) && (!used[i]) ) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1)) return true; } } } return false; } int main () { for(;;) { int n; cin >> n; if (cin.eof()) break; unordered_set cards; for (int i = 0; i < n; i++) { char r, s; cin >> r >> s; //cout << r << s << card_id(r, s) << '\n'; cards.insert(card_id(r, s)); } if (n == 1) { cout << "NO\n"; continue; } vector used(52, false); bool flag = false; for (int from: cards) { //cout << "start at" << from << '\n'; if (DFS(cards, used, from, 0)) { cout << "YES\n"; flag = true; break; } } if (!flag) { cout << "NO\n"; continue; } } return 0; }