Example #1
0
void Checker::parse(ManagerBase* m, std::vector<Card>& src, CardContainer& res)
{
    std::sort(src.begin(), src.end(), CardSortCmp(m));
    res.clear();
    CardUnit single;
    single.mask.set(CardMask::Single);
    std::vector<CardUnit> pairUnit;
    Card pre;
    for (auto& i : src) {
        if (pre == i) {
            pairUnit.push_back({CardMask::Pair|CardMask(m, i),{i, i}});
            pre.set(Card::Null);
        } else {
            if (pre.value() != Card::Null) {
                single.mask.merge(CardMask(m, pre));
                single.cards.push_back(pre);
            }
            pre = i;
        }
    }
    if (pre.value() != Card::Null) {
        single.mask.merge(CardMask(m, pre));
        single.cards.push_back(pre);
    }
    if (!pairUnit.empty()) {
        size_t i = 0;
        for (size_t j = 1; j < pairUnit.size(); ++j) {
            if (canConcat(m, pairUnit[i].cards.back(), pairUnit[j].cards[0])) {
                pairUnit[i].cards.insert(pairUnit[i].cards.end(), pairUnit[j].cards.begin(), pairUnit[j].cards.end());
            } else {
                res.put(pairUnit[i]);
                i = j;
            }
        }
        res.put(pairUnit[i]);
        if (res.size() > 1 && pairUnit.size() > 2) {
            res.sort([](const CardUnit& u1, const CardUnit& u2) {
                return u1.cards.size() > u2.cards.size();
            });
        }
    }
    if (!single.cards.empty()) {
        res.put(single);
    }
}
Example #2
0
 int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
     if(canConcat(beginWord, endWord))
         return 2;
     
     wordList.insert(endWord);
     queue<pair<string,int>> q;
     
     q.push(make_pair(beginWord, 1));
     
     while(!q.empty()){
         auto current = q.front();
         q.pop();
         auto neighbors = findNeighbors(current.first, wordList);
         
         for(auto& w : neighbors){
             if(w == endWord)
                 return current.second + 1;
             q.push(make_pair(w, current.second + 1));
         }
         
     }
     return 0;
 }