题意:

  给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断):1、头两张+尾一张和为10或20或30。2、头一张+尾两张和为10或20或30。3、尾三张和为10或20或30。就把这三张牌拿走,放到总牌堆底(这步要不断执行直到不再满足条件或牌堆没了)如果有一个牌堆因为这个操作被取完了,那么以后将不在这个位置发牌。如果最后7个牌堆都可以消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)。问最后的输赢平,并输出步数

分析:

  模拟,用一个vector记录下7个牌堆和总牌堆,这样就可以用set去记录状态了,然后每个牌堆用一个双端队列deque表示,这样满足可以从头也可以从尾巴取,不断模拟即可

代码:

  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int N=7;
int ans;
struct node
{
int v[N*10];
bool operator<(const node &a) const
{
return memcmp(v,a.v,sizeof(node))<0;
}
};
queue<int> hand;
deque<int> piles[N];
map<node,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 i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
piles[j].push_back(hand.front());
hand.pop();
}
}
ans=14;
node 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;
}
int main()
{
int card;
while(scanf("%d",&card)&&card)
{
while (!hand.empty())
{
hand.pop();
}
st.clear();
for (int i = 0; i < N; i++)
piles[i].clear();
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); }
}
05-11 02:13