UVA204 (ACM/ICPC World Finals 1996) 10-20-30
题目链接
题意分析
为了保证食用愉快 题目链接我给了vjudge
给你52张扑克牌
一开始依次取7张牌 每张牌成一个牌堆的首发
然后从取第8张牌开始依次往每个牌堆积上
如果发生了这样的情况的一种
注意 存在优先级顺序
1.牌堆堆首的2张牌与牌堆堆尾的1张牌
2.牌堆堆首的1张牌与牌堆堆尾的2张牌
3.牌堆堆尾的3张牌
三张牌的数值相加等于10或者20或者30
那么就可以去掉这3张牌 按照原顺序放在手中牌的最后面
注意 观察了网上的解法发现 我们需要不断地循环123123123
而且顺从优先级 并且123中一个可以的话 就继续下一个循环
知道牌不够3张 或者一次循环中123一个也执行不了
如果取了当前这一张牌后的局面是手中没牌或者手中牌全了或者出现局面重复
那么就结束
这道题乍一看就是一道模拟题
但是不妨碍它成为一道STL练手题
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
//这道题再一次刷新了我对STL的认知
using namespace std;
int num;bool zero[10];
vector<deque<int> > ple;
set<vector<deque<int> > > vis;
int check(int now)
{return now==7 ? 1:now+1;}
void init()
{
vis.clear();ple.clear();
memset(zero,0,sizeof zero);
for(int i=1;i<=9;++i)
ple.push_back(deque<int>());
ple[8].push_back(num);
// puts("No problem!");
for(int i=1;i<=51;++i)
{
scanf("%d",&num);
// printf("have %d\n",i);
ple[8].push_back(num);
// printf("No prolbem!\n");
}
// puts("nonono");
for(int i=1;i<=7;++i)
{
int now=ple[8].front();
ple[8].pop_front();
ple[i].push_back(now);
}
// puts("Yes");
}
void isok(int now)
{
if(ple[now].size()<3) return;
// while(1)
// {
//// puts("执行一");
// if(ple[now].size()<3) break;
// int cdy=ple[now].front();ple[now].pop_front();
// int wzy=ple[now].front();ple[now].pop_front();
// int zjz=ple[now].back();ple[now].pop_back();
// int sum=cdy+wzy+zjz;
// if(sum==10||sum==20||sum==30)
// {
// ple[8].push_back(cdy);
// ple[8].push_back(wzy);
// ple[8].push_back(zjz);
// continue;
// }
// else
// {
// ple[now].push_front(wzy);
// ple[now].push_front(cdy);
// ple[now].push_back(zjz);
// break;
// }
// }
// while(1)
// {
//// puts("执行二");
// if(ple[now].size()<3) break;
// int cdy=ple[now].front();ple[now].pop_front();
// int wzy=ple[now].back();ple[now].pop_back();
// int zjz=ple[now].back();ple[now].pop_back();
// int sum=cdy+wzy+zjz;
// if(sum==10||sum==20||sum==30)
// {
// ple[8].push_back(cdy);
// ple[8].push_back(zjz);
// ple[8].push_back(wzy);
// continue;
// }
// else
// {
// ple[now].push_front(cdy);
// ple[now].push_back(zjz);
// ple[now].push_back(wzy);
// break;
// }
// }
// while(1)
// {
//// puts("执行三");
// if(ple[now].size()<3) break;
// int cdy=ple[now].back();ple[now].pop_back();
// int wzy=ple[now].back();ple[now].pop_back();
// int zjz=ple[now].back();ple[now].pop_back();
// int sum=cdy+wzy+zjz;
// if(sum==10||sum==20||sum==30)
// {
// ple[8].push_back(zjz);
// ple[8].push_back(wzy);
// ple[8].push_back(cdy);
// continue;
// }
// else
// {
// ple[now].push_back(zjz);
// ple[now].push_back(wzy);
// ple[now].push_back(cdy);
// break;
// }
// }
bool flag=1;
while(flag)
{
flag=0;
if(ple[now].size()<3) break;
int cdy=ple[now].front();ple[now].pop_front();
int wzy=ple[now].front();ple[now].pop_front();
int zjz=ple[now].back();ple[now].pop_back();
int sum=cdy+wzy+zjz;
if(sum==10||sum==20||sum==30)
{
ple[8].push_back(cdy);
ple[8].push_back(wzy);
ple[8].push_back(zjz);
flag=1;continue;
}
else
{
ple[now].push_front(wzy);
ple[now].push_front(cdy);
ple[now].push_back(zjz);
}
if(ple[now].size()<3) break;
cdy=ple[now].front();ple[now].pop_front();
wzy=ple[now].back();ple[now].pop_back();
zjz=ple[now].back();ple[now].pop_back();
sum=cdy+wzy+zjz;
if(sum==10||sum==20||sum==30)
{
ple[8].push_back(cdy);
ple[8].push_back(zjz);
ple[8].push_back(wzy);
flag=1;continue;
}
else
{
ple[now].push_front(cdy);
ple[now].push_back(zjz);
ple[now].push_back(wzy);
}
if(ple[now].size()<3) break;
cdy=ple[now].back();ple[now].pop_back();
wzy=ple[now].back();ple[now].pop_back();
zjz=ple[now].back();ple[now].pop_back();
sum=cdy+wzy+zjz;
if(sum==10||sum==20||sum==30)
{
ple[8].push_back(zjz);
ple[8].push_back(wzy);
ple[8].push_back(cdy);
flag=1;continue;
}
else
{
ple[now].push_back(zjz);
ple[now].push_back(wzy);
ple[now].push_back(cdy);
break;
}
}
return;
}
void solve()
{
int at=1;
for(int t=8;;++t)
{
int now=ple[8].front();
ple[8].pop_front();
ple[at].push_back(now);
// puts("指标一正确");
isok(at);
// puts("指标二正确");
if(ple[at].empty()) zero[at]=1;
at=check(at);
// puts("指标三正确");
if(vis.find(ple)!=vis.end())
{
printf("Draw: %d\n",t);
return;
}
// puts("指标三点五正确");
vis.insert(ple);
// puts("指标四正确");
if(ple[8].empty())
{
printf("Loss: %d\n",t);
return;
}
if((int)ple[8].size()==52)
{
printf("Win : %d\n",t);
return;
}
// puts("指标五正确");
while(zero[at]) at=check(at);
}
}
int main()
{
// freopen("sample.txt","r",stdin);
// freopen("tmp.txt","w",stdout);
while(scanf("%d",&num)!=EOF&&num)
{
init();
// puts("we can");
solve();
}
return 0;
}