#include #include using namespace std; typedef struct card { char rank, suit; bool used = false; } Card; vector cards; bool done = false; bool recursion(int depth, Card * parent) { if (done) return true; if (depth == cards.size()) { done = true; return true; } bool ret = false; for (const auto & card : cards) { if (done) return true; if (card->used == false) { if (parent != NULL) if (card->rank != parent->rank && card->suit != parent->suit) continue; card->used = true; ret = ret || recursion(depth + 1, card); card->used = false; } } return ret; } int main(int argc, char ** argv) { int n; while (cin >> n) { bool fail = false; done = false; for (int i = 0; i < n; ++i) { char c; Card * temp = new Card(); scanf("%c%c%c", &c, &temp->rank, &temp->suit); cards.push_back(temp); } int cnt = 0; for (int i = 0; i < cards.size(); ++i) { bool flag = false; for (int j = 0; j < cards.size(); ++j) { if (i!=j && (cards[i]->rank == cards[j]->rank || cards[i]->suit == cards[j]->suit)) { cnt++; flag = true; } } if (flag == false) { fail = true; break; } } if (cnt < n - 1 || fail == true) { cout << "NO" << endl; cards.clear(); continue; } bool a = recursion(0, NULL); if (a) cout << "YES" << endl; else cout << "NO" << endl; cards.clear(); } return 0; }