用vector<deque<int> > 模拟,set<vector<deque<int> > > 判重复,
本题可用链表模拟,但是用链表时,因为牌的value会重复,若用数组实现链表,(left【maxn】,right【maxn】)需对每张牌预先分配一个唯一识别编号
若用指针型链表没有这个问题,但指针链表更加容易出错,而且并不好写;曾用指针链表写了一下,过了样例,却WA;用数组链表过了一个,本文只展示用STL 模拟代码
#include <set>
#include <deque>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LOSS 1
#define WIN 2
#define DRAW 3
vector<deque<int> > ve;
set<vector<deque<int> > > vis;
int x;
void read(){
for(int i=0;i<8;i++) ve.push_back(deque<int>() );
for(int i=0;i<7;i++){
if(i) scanf("%d",&x);
ve[i].push_back(x);
}
for(int i=7;i<52;i++){
scanf("%d",&x);
ve[7].push_back(x);
}
}
void init(){
ve.clear();
vis.clear();
}
bool Judge(int num){
return num==10||num==20||num==30;
}
bool handle_one(int i){
int x=ve[i].front(); ve[i].pop_front();
int y=ve[i].front();
int z=ve[i].back();
if(!Judge(x+y+z)) {
ve[i].push_front(x);
return false;
}
ve[i].pop_front(); ve[i].pop_back();
ve[7].push_back(x);
ve[7].push_back(y);
ve[7].push_back(z);
return true;
}
bool handle_two(int i){
int x=ve[i].front();
int z=ve[i].back(); ve[i].pop_back();
int y=ve[i].back();
if(!Judge(x+y+z)) {
ve[i].push_back(z);
return false;
}
ve[i].pop_front(); ve[i].pop_back();
ve[7].push_back(x);
ve[7].push_back(y);
ve[7].push_back(z);
return true;
}
bool handle_three(int i){
int z=ve[i].back(); ve[i].pop_back();
int y=ve[i].back(); ve[i].pop_back();
int x=ve[i].back();
if(!Judge(x+y+z)) {
ve[i].push_back(y);
ve[i].push_back(z);
return false;
}
ve[i].pop_back();
ve[7].push_back(x);
ve[7].push_back(y);
ve[7].push_back(z);
return true;
}
int main()
{
while(scanf("%d",&x)==1&&x){
init();
read();
void show();
int key=0,step=0,res;
for(int i=0;;i=(i+1)%7){
if(ve[i].empty()){
key++; if(key==7) {res=WIN; break;
}
continue;
}
else {
key=0; step++;
}
if(ve[7].empty()){
res=LOSS;
step--; break;
}
int temp=ve[7].front();
ve[7].pop_front();
ve[i].push_back(temp);
for(;;){
if(ve[i].size()<3) break;
bool flag=false;
for(int d=1;d<=3;d++){
switch(d){
case 1: if(handle_one(i)) flag=true; break;
case 2: if(handle_two(i)) flag=true; break;
case 3: if(handle_three(i)) flag=true; break;
}
if(flag) break;
}
if(!flag) break;
}
if(vis.count(ve)){
res=DRAW; break;
}
else vis.insert(ve);
//show();
}
switch(res){
case LOSS:printf("Loss: "); break;
case WIN :printf("Win : "); break;
case DRAW:printf("Draw: "); break;
}
printf("%d\n",step+7);
}
return 0;
}
deque<int> ::iterator iter;
void show()
{
cout<<"---------------\n";
for(int i=0;i<8;i++){
for(iter=ve[i].begin();iter!=ve[i].end();iter++){
printf("%d ",*iter);
}
printf("\n");
}
}