题目大意:给出52张牌,不分花色,先发七张,形成7堆,然后再从左往右的发牌。如果能够找到三张牌他们的和是10, 20, 30的话,就可以把三张牌按照先后顺序放到你手中的牌的后面。这样一直进行下去,如果你手中有52张牌就赢了,如果你手中没有牌就输了,如果某个状态之前已经出现过,那么就输出draw。然后还要输出总共处理了多少张牌能够得到结果。
解题思路:注意这里不是有三种情况取三张牌,题目貌似保证只会出现这三种中的某一种,这样情况就减少了。然后用队列去模拟,这题学到了一个新的知识点,可以用map来对数组进行判重。
代码:
#include <cstdio> #include <cstring> #include <queue> #include <deque> #include <vector> #include <map> using namespace std; const int N = 7; int ans; struct State { int v[N * 10]; bool operator < (const State &a) const { return memcmp (v, a.v, sizeof(State)) < 0; } }; queue<int> hand; deque<int> piles[N]; map<State, int> st; void handle (deque<int>& pile) { while (pile.size() >= 3) { int n = pile.size(); if ((pile[0] + pile[1] + pile[n - 1]) % 10 == 0) { hand.push(pile[0]); hand.push(pile[1]); hand.push(pile[n - 1]); pile.pop_front(); pile.pop_front(); pile.pop_back(); } else if ((pile[0] + pile[n - 1] + pile[n - 2]) % 10 == 0) { hand.push(pile[0]); hand.push(pile[n - 2]); hand.push(pile[n - 1]); pile.pop_front(); pile.pop_back(); pile.pop_back(); } else if ((pile[n - 1] + pile[n - 2] + pile[n - 3]) % 10 == 0) { hand.push(pile[n - 3]); hand.push(pile[n - 2]); hand.push(pile[n - 1]); pile.pop_back(); pile.pop_back(); pile.pop_back(); } else return; } } int solve () { for (int k = 0; k < 2; k++) { for (int i = 0; i < N; i++) { piles[i].push_back(hand.front()); hand.pop(); } } ans = 14; State tmp; while (hand.size()) { for (int i = 0; i < N; i++) { if (hand.size() == 52) return 1; if (piles[i].size() == 0) continue; if (hand.size()) { piles[i].push_back(hand.front()); hand.pop(); ans++; handle(piles[i]); //判重 int cnt = 0; memset (tmp.v, 0, sizeof (tmp.v)); for (int k = 0; k < N; k++) { for (int j = 0; j < piles[k].size(); j++) tmp.v[cnt++] = piles[k][j]; tmp.v[cnt++] = 11; } queue<int> q = hand; while (!q.empty()) { tmp.v[cnt++] = q.front(); q.pop(); } tmp.v[cnt] = 11; if (st[tmp]) return -1; else st[tmp] = 1; } else return 0; } } return 0; } void init () { while (!hand.empty()) { hand.pop(); } st.clear(); for (int i = 0; i < N; i++) piles[i].clear(); } int main () { int card; while (scanf ("%d", &card) && card) { init(); hand.push(card); for (int i = 0; i < 51; i++) { scanf ("%d", &card); hand.push(card); } int tmp = solve(); if (tmp == 0) printf ("Loss: %d\n", ans); else if (tmp == 1) printf ("Win : %d\n", ans); else printf ("Draw: %d\n", ans); } return 0; }
时间: 2024-09-28 17:48:04