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
- UVA - 246
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- C语言 C语言读取十六进制文件.hex
- easyui 1.4 datagrid 请求两次的原因
- 今天第一天加入csdn了
- vmware虚拟机系统安装
- CString转doubl饿
- UVA - 246
- 如何查看自己运行ubuntu是32位还是64位
- html标签
- The Recode of the sat-problem
- 第三只眼看SpringSide-一个极富魅力的偶像团队
- php借助linux实现多线程1
- Matlab实例学习--------不同界面的数据传递(多窗口编程)(实例)
- 集群环境下防止并发的一种实现( Spring Quartz 集群思路)
- getCurrentSession 与 openSession() 的区别