现在的位置: 首页 > 综合 > 正文

UVA – 246

2019年04月04日 ⁄ 综合 ⁄ 共 2329字 ⁄ 字号 评论关闭

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

【上篇】
【下篇】

抱歉!评论已关闭.