AOJ 10015 - Finding Missing Cards
AOJ先生が4x13の配列つくるといいよと言ってくれましたが、俺はこのset_differenceを使うぜ。
まず、すべてのカードの配列をつくります。
次に、持っているカードの配列をつくります。
その差は失くしたカードになります。
set_differenceの第5引数は第一のiteratorの中の値が第二のiteratorより小さいときTrue、
それ以外のときfalseを返すようにするそうです(less thanとequalをなぜか間違えてた)
あと、第4引数はdiffだとだめで(日本のcppreferenceが間違ってる?)、
std::inserter(diff, diff.begin())(英語のcppreferenceでの記述)は通りました。
Output_iteratorとinserterを調べないといけないですね。
for_each, lambda式ををつかったので、今回はC++11で提出しました。
#include <iostream> #include <vector> #include <algorithm> struct card{ char mark; int number; card(char, int); }; card::card(char _mark, int _number) :mark(_mark), number(_number){} int MarkToInt(char mark){ if(mark == 'S')return 0; else if(mark == 'H')return 1; else if(mark == 'C')return 2; else if(mark == 'D')return 3; return -1; } bool AscendingCard(const card& left_card, const card& right_card){ int lm = MarkToInt(left_card.mark), rm = MarkToInt(right_card.mark); if(lm != rm){ return lm < rm; } return left_card.number < right_card.number; } int main(){ char marks[] = {'S', 'H', 'C', 'D'}; std::vector<card> all_cards, brought_cards; for(int i=0;i<4;i++){ for(int j=1;j<=13;j++){ card new_card = card(marks[i], j); all_cards.push_back(new_card); } } int n; std::cin >> n; char mark; int number; while(n--){ std::cin >> mark >> number; card new_card = card(mark, number); brought_cards.push_back(new_card); } std::sort(brought_cards.begin(), brought_cards.end(), AscendingCard); std::vector<card> diff; std::set_difference(all_cards.begin(), all_cards.end(), brought_cards.begin(), brought_cards.end(), std::inserter(diff, diff.begin()), AscendingCard); auto show = [](card &c){ std::cout << c.mark << " " << c.number << std::endl; }; std::for_each(diff.begin(), diff.end(), show); }