模拟题,使用了list。
注意:开始将摆放出7个牌堆也应计算在cnt内。
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<cstdio>
#include<iostream>
#include<string>
#include<numeric>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#include<sstream>
#include<fstream>
#include<queue>
#include<stack>
#include<unordered_map>
#include<tuple>
#include<deque>
#include<functional>
#include<iterator>
#include<array>
#include<list>
#include<forward_list>
#include<unordered_set>
using namespace std;
bool isLoop(unordered_set<string>& status, const list<list<int>>& piles, list<int>& deck)
{
string s;
for (auto& pile : piles)
{
for (auto& e : pile)
{
s += char(e + 'A');
}
s += '|';
}
s += '-';
for (auto& e : deck)
{
s += e + 'A';
}
if (status.count(s) > 0)
return true;
status.insert(s);
return false;
}
bool isvalid(int a, int b, int c)
{
int temp = a + b + c;
return temp == 10 || temp == 20 || temp == 30;
}
bool moveCard(list<int>::iterator& iterf1, list<int>::iterator& iterf2, list<int>::iterator& iterl1, list<list<int>>::iterator& iterlists, list<int>& deck)
{
if (isvalid(*iterf1, *iterf2, *iterl1))
{
deck.push_back(*iterf1);
deck.push_back(*iterf2);
deck.push_back(*iterl1);
iterlists->erase(iterf1);
iterlists->erase(iterf2);
iterlists->erase(iterl1);
return true;
}
return false;
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int tmp;
while (scanf("%d", &tmp) == 1 && tmp != 0)
{
list<int>deck;
unordered_set<string>status;
list<list<int>>piles;
deck.push_back(tmp);
int cnt = 0;
for (int i = 1; i < 52; ++i)
{
scanf("%d", &tmp);
deck.push_back(tmp);
}
for (int i = 0; i < 7; ++i)
{
tmp = deck.front();
deck.pop_front();
list<int>t(1, tmp);
piles.push_back(std::move(t));
}
list<list<int>>::iterator iterlists = piles.begin();
bool is_loop = 0;
string w;
while (++cnt)
{
int curdeck = deck.front();
deck.pop_front();
bool ok = 1;
iterlists->push_back(curdeck);
while (iterlists->size() >= 3 && ok)
{
if (isLoop(status, piles, deck))
{
is_loop = 1;
ok = 0;
break;
}
list<int>::iterator iterf1 = iterlists->begin();
list<int>::iterator iterf2 = ++iterlists->begin();
list<int>::iterator iterl1 = --iterlists->end();
list<int>::iterator iterl2 = --iterlists->end();
list<int>::iterator iterl3 = --iterl2;
--iterl3;
if (!moveCard(iterf1, iterf2, iterl1, iterlists, deck) && !moveCard(iterf1, iterl2, iterl1, iterlists, deck) && !moveCard(iterl3, iterl2, iterl1, iterlists, deck))
{
ok = 0;
}
}
if (is_loop == 1)
{
w = "Draw";
break;
}
if (iterlists->size() == 0)
{
iterlists = piles.erase(iterlists);
}
else
++iterlists;
if (iterlists == piles.end())
{
iterlists = piles.begin();
}
if (piles.size() == 0)
{
w = "Win ";
break;
}
if (deck.size() == 0)
{
w = "Loss";
break;
}
}
printf("%s: %d\n", w.c_str(), cnt+7);
}
}