UVA - 246

来源:互联网 发布:联想笔记本安装mac os 编辑:程序博客网 时间:2024/06/05 20:15

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




0 0
原创粉丝点击