uva127 纸牌游戏 (链表题)
来源:互联网 发布:php视频用什么软件 编辑:程序博客网 时间:2024/05/16 12:57
题意:你的任務是模擬一種叫「Accordian」的紙牌遊戲,他的遊戲規則如下:
一副撲克牌有52張牌,首先把紙牌一張一張由左到右排好(不能有重疊,所以共有52堆牌,每堆一張),當某一張牌與他左邊那張牌或者左邊的第三張牌有「Match」的時候,就把這張牌移到那張牌上面去。在這裡兩張牌「Match」指的是這兩張牌的花色(suit)或者點數(rank)一樣。當你做了一個移動之後,要察看是否還可以做其他的移動。在任何時間,只有最上面那張牌可以被移動。如果因為移動一張牌使得產生一個空格(也就是被移動的那堆牌只有一張牌),你必須把右邊所有的牌堆往左移一格。如此不斷的尋找可移動的牌,直到沒有一張牌可以移動遊戲就結束了。
在選擇可以移動的牌的時候可能有些狀況會發生。如果有兩張牌都可以移動,你應該要移動最左邊的那張牌。當一張牌可以被移動到左邊一格,或左邊三格的時候,你必須移動到左邊三格。
Input
輸入包含多組測試資料。每組測試資料兩列,每列有26張牌的資料。每張牌以2個字元代表。第一個字元代表牌的點數(A=Ace, 2~9, T=10, J=Jack, Q=Queen, K=King),第二個字元代表牌的花色(C=Clubs, D=Diamonds, H=Hearts, S=Spades)
若遇到僅含#的一列代表輸入結束。請參考Sample Input。
Output
對每組測試資料輸出遊戲結束時剩下幾堆牌,以及每堆牌有多少張牌。請注意如果只有1堆牌,pile後沒有加s,請參考Sample Output。
Sample input
QD AD 8H 5S 3H 5H TC 4D JH KS 6H 8S JS AC AS 8D 2H QS TS 3S AH 4H TH TD 3C 6S
8C 7D 4C 4S 7S 9H 7C 5D 2S KD 2D QH JD 6D 9D JC 2C KH 3D QC 6C 9S KC 7H 9C 5C
AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D TD 9D JD QD KD
AH 2H 3H 4H 5H 6H 7H 8H 9H KH 6S QH TH AS 2S 3S 4S 5S JH 7S 8S 9S TS JS QS KS
#
Sample Output
6 piles remaining: 40 8 1 1 1 1
1 pile remaining: 52
这是一道典型的模拟题, ,当时一看感觉算法很简单,但是又好像无从下笔,因为 太长时间没有动脑筋和 去思考了,哎,真是废啊,还是参考了大牛们得思想,不过唯一的收获是学会了点关于stl的东西。还有就是如果要写的话就找一种数据结构来做,不要用用这个,又用那个,这样反而不好。
#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#include<vector>using namespace std;const int N=55;struct node{ char face; char suit;};vector< vector<node> > List; // 简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector就是一个容器,这里vector里装的就是node这种结构体的容器。 bool match(node a,node b){ return a.face==b.face||a.suit==b.suit;}bool test(){ bool flag=false; int k,t; int s=List.size(); for(int i=s-1;i>0;i--){ if(i-3>=0&&match(List[i].back(),List[i-3].back())){ k=i; t=3; flag=true; } //根据题意,先往左边的第三个挪动 else if(i-1>=0&&match(List[i].back(),List[i-1].back())){ k=i; t=1; flag=true; } //在往左边挪动 } if(flag){ List[k-t].push_back(List[k].back()); List[k].pop_back(); if(List[k].empty()){ List.erase(List.begin()+k);//挪动后,如果该组空了,右边的都要往左边来挪动。 } return true; } return false;}//得到牌最后的位置int main(){ node p; vector<node> l; while(cin>>p.face&&p.face!='#'){ cin>>p.suit; l.clear(); l.push_back(p); List.clear(); List.push_back(l); for(int i=2;i<=52;i++){ cin>>p.face>>p.suit; l.pop_back(); l.push_back(p); List.push_back(l); } while(test()); string c=List.size()>1?"s":""; cout<<List.size()<<"pile"<<c<<" remaining:"; for(int i=0;i<List.size();i++){ cout<<' '<<List[i].size(); } cout<<endl; } return 0;}
- uva127 纸牌游戏 (链表题)
- uva127-模拟纸牌游戏
- uva127- "Accordian'' Patience(纸牌游戏)
- uva127(纸牌游戏)—线性表+模拟
- uva127--手风琴纸牌
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- 纸牌游戏
- uva127
- uva127
- uva127
- hdu 翻纸牌游戏(BFS)
- Spring Security3.1 最新配置实例
- linux 分区
- js函数获取html中class所在的内容
- 使用美图秀秀去水印、痘痘、路人甲教程
- cpp 析构函数的两个执行时机
- uva127 纸牌游戏 (链表题)
- ABAP 锁对象与加锁机制
- 使用QueryPerformanceFrequency 计算程序执行时间
- String3 MVC-----使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务
- MAC下cocos2d-x项目转化Android项目的具体实现方法
- 我心目中最好的框架组合是
- linux下磁盘分区详解 详细出处参考:http://www.jb51.net/LINUXjishu/57192.html
- C++头文件重复编译的问题
- Python升级