首页 > 代码库 > uva 127 "Accordian" Patience(手风琴纸牌)
uva 127 "Accordian" Patience(手风琴纸牌)
用 栈 stack 来处理.
直接根据题目描述写就可以。不要忘记每组数据最后的清空栈堆。
题目大意: 给定52张的扑克牌,现在要求对扑克牌进行整理,对于每一张扑克牌,如果左边的第三张存在那么就去判断这一张是否和第三张满足花色或卡片值相同,如果满足则把这一张移动到左边的第三张,否则去判断左边的第一张是否和这一张满足条件;如果左边的第三张不存在那么只要去判断左边的第一张即可。最后输出剩下的扑克牌的堆数,并且输出每一堆的牌数。
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<stack> using namespace std; const int maxn=52+5; stack<string>s[maxn]; bool match(string a,string b) { return (a[0]==b[0]||a[1]==b[1]); } int main() { int n(0); string t; while(cin>>t&&t!="#") { s[n].push(t); n++; if(n>=52) { while(true) { int pos,sign; for(pos=0;pos<n;pos++) { if(pos>=3&&match(s[pos].top(),s[pos-3].top())) { sign=1; break; } if(pos>=1&&match(s[pos].top(),s[pos-1].top())) { sign=2; break; } } if(pos==n) { break; } if(sign==1) { s[pos-3].push(s[pos].top()); } if(sign==2) { s[pos-1].push(s[pos].top()); } s[pos].pop(); if(s[pos].empty()) { for(int i=pos;i<n-1;i++) { s[i]=s[i+1]; } if(!s[n-1].empty()) { s[n-1].pop(); } n--; } } printf("%d ",n); printf("piles remaining:"); for(int i=0;i<n;i++) { printf(" %d",s[i].size()); } printf("\n"); for(int i=0;i<n;i++) { while(!s[i].empty()) { s[i].pop(); } } n=0; } } return 0; }
简单数据结构。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。