UVA 246 10-20-30
2016-02-27 18:28
429 查看
题意:有52张牌摞在一起作为总牌堆,有7个牌堆都为空,现在不断从总牌堆中取牌按照顺序从左往右放到牌堆上。如果当前牌堆放上一张牌后满足(1、前两张加上最后一张牌 2、第一张牌加最后两张牌 3、最后三张牌)按照顺序判断,如果点数之和为10/20/30,就把这三张牌放回总牌堆底下,一直操作到这个牌堆不满足这三个条件为止。如果一个牌堆为空,那么就不再向这个牌堆上放牌。最后有三种情况:1、总牌堆为空 2、7个牌堆为空 3、出现循环情况。判断最后会变为那种情况,并输出可以判断出这种情况的最少步数,每放一张牌算一步。
思路:模拟判断。用vector来表示这8个牌堆,erase(vector.begin())和pop_back分别可以从首尾去删除牌。用map<vector [8]>来判断是否循环。每次放一张牌,步数加一。然后对三种情况进行判断,操作直到不满足情况为止。再对三种结束情况进行判断。
思路:模拟判断。用vector来表示这8个牌堆,erase(vector.begin())和pop_back分别可以从首尾去删除牌。用map<vector [8]>来判断是否循环。每次放一张牌,步数加一。然后对三种情况进行判断,操作直到不满足情况为止。再对三种结束情况进行判断。
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <cstdlib> #include <iostream> #include <algorithm> #include <stack> #include <map> #include <set> #include <vector> #include <sstream> #include <queue> #include <utility> using namespace std; #define rep(i,j,k) for (int i=j;i<=k;i++) #define Rrep(i,j,k) for (int i=j;i>=k;i--) #define Clean(x,y) memset(x,y,sizeof(x)) #define LL long long #define ULL unsigned long long #define inf 0x7fffffff #define mod %100000007 struct node { vector<int> a[8]; //0~6 代表可放的牌堆,7代表总牌堆 void clr() { rep(i,0,7) a[i].clear(); } bool operator <(const node &x) const { rep(i,0,7)· if ( a[i]!=x.a[i] ) return a[i]<x.a[i]; return a[0]<x.a[0]; } }card; int tot; int step; map<node,int> p; bool init() { int temp; scanf("%d",&temp); if ( !temp ) return false; tot = 7; step = 7; card.clr(); p.clear(); rep(i,0,6) { if ( i ) scanf("%d",&temp); card.a[i].push_back(temp); } rep(i,1,45) { scanf("%d",&temp); card.a[7].push_back(temp); } return true; } void add(int x,int k) { card.a[x].push_back(k); bool can = true; while( can && card.a[x].size()>=3 ) { can = false; int m = card.a[x].size(); if ( ( card.a[x][0] + card.a[x][1] + card.a[x][m-1] ) % 10 == 0 ) { can = true; card.a[7].push_back(card.a[x][0]); card.a[7].push_back(card.a[x][1]); card.a[7].push_back(card.a[x][m-1]); card.a[x].erase(card.a[x].begin()); card.a[x].erase(card.a[x].begin()); card.a[x].pop_back(); } else if ( ( card.a[x][0] + card.a[x][m-1] + card.a[x][m-2] ) % 10 == 0 ) { can = true; card.a[7].push_back(card.a[x][0]); card.a[7].push_back(card.a[x][m-2]); card.a[7].push_back(card.a[x][m-1]); card.a[x].erase(card.a[x].begin()); card.a[x].pop_back(); card.a[x].pop_back(); } else if ( ( card.a[x][m-3] + card.a[x][m-1] + card.a[x][m-2] ) % 10 == 0 ) { can = true; card.a[7].push_back(card.a[x][m-3]); card.a[7].push_back(card.a[x][m-2]); card.a[7].push_back(card.a[x][m-1]); card.a[x].pop_back(); card.a[x].pop_back(); card.a[x].pop_back(); } } } int main() { while( init() ) { bool flag = true; while( flag ) { rep(i,0,6) { if ( card.a[i].size() == 0 ) continue; //牌堆为空,不再放牌 int k = card.a[7][0]; //取出总牌堆最上面的牌 card.a[7].erase(card.a[7].begin()); //删除 step++; add(i,k); // 放到第i个牌堆上 if ( card.a[i].size() == 0 ) tot--; //如果操作完后第i个牌堆为空,可用的堆数就减一。 if ( tot == 0 ) { printf("Win : %d\n",step); flag = false; break; } else if ( card.a[7].size() == 0 ) { printf("Loss: %d\n",step); flag = false; break; } else if ( p[card] == 1 ) { printf("Draw: %d\n",step); flag = false; break; } p[card] = 1; } } } return 0; }
相关文章推荐
- 在VMWare安装Xinu
- 1075 PAT Judge
- web page collection
- 菜鸟在线Unity3d教程:如何获取摄像机图像?
- 关于Tcp封包
- 【原】spark-submit提交应用程序的内部流程
- 设计模式入门之訪问者模式Visitor
- 判断是否为回文
- UVA 127 "Accordian" Patience
- java 乱码问题-Dfile.encoding=UTF-8
- Android Audio Framework 之AudioPolicyService
- Cocos2d-x 3.x物理世界
- 当导航条滚动到顶部时固定到顶部
- 京东左侧悬浮导航制作
- CodeForces 611 B. New Year and Old Property(水~)
- Python篇----提供pip和virtualenv的Uranium之介绍(翻译篇)
- 14.04麒麟为/检查磁盘时发生严重错误的解决方法
- iOS 中捕获程序崩溃日志
- Java动态加载jar文件
- Google推荐的图片加载库Glide介绍