用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"); } }