127 - "Accordian" Patience***

//栈的模型,后进先出 //题不是很难,关键涉及什么数据结构要想清楚 //细节处理,考虑全 #include <iostream> #include <sstream> #include <cstdio> #include <string> #include <cstring> using namespace std; int len; typedef struct{ char face_value; char suit; }Card; struct Rank{ Card cards[55]; int top; }ranks[55]; void mov(int n) { for(;n<len;n++) ranks[n]=ranks[n+1]; } int isSame(int x,int y) { if(ranks[x].cards[ranks[x].top].face_value==ranks[y].cards[ranks[y].top].face_value || ranks[x].cards[ranks[x].top].suit==ranks[y].cards[ranks[y].top].suit) return 1; else return 0; } int handle(int n) { if(n>=len) return 0; int k=n; while(k>0) { if(k>=3 && isSame(k-3,n)) k=k-3; else if(k>=1 && isSame(k-1,n)) k=k-1; else break; } if(k!=n) { ranks[k].cards[++ranks[k].top]=ranks[n].cards[ranks[n].top--]; if(ranks[n].top==-1) { mov(n); len--; } //handle(k+1); //handle(k+3); return 1; } return 0; } int main() { //freopen("127.in","r",stdin); //freopen("127.out","w",stdout); string line; while(getline(cin,line) && line!="#") { memset(ranks,0,sizeof(ranks)); len=52; int u=0; istringstream in(line); string a; while(in>>a) { ranks[u].cards[0].face_value=a[0]; ranks[u].cards[0].suit=a[1]; u++; } getline(cin,line); istringstream in2(line); while(in2>>a) { ranks[u].cards[0].face_value=a[0]; ranks[u].cards[0].suit=a[1]; u++; } int flag=1; while(flag==1) { flag=0; for(int i=0;i<len;i++) { if(handle(i)) { flag=1; break; } } } printf("%d ",len); if(len==1) printf("pile remaining:"); else printf("piles remaining:"); for(int i=0;i<len;i++) printf(" %d",ranks[i].top+1); printf("\n"); } return 0; }



//stl实现 #include <iostream> #include <sstream> #include <cstdio> #include <string> #include <cstring> #include <stack> using namespace std; int len; struct Card{ char face_value; char suit; Card(char a,char b):face_value(a),suit(b){} }; stack<Card> ranks[55]; void mov(int n) { for(;n<len-1;n++) ranks[n]=ranks[n+1]; } int isSame(int x,int y) { if(ranks[x].top().face_value==ranks[y].top().face_value || ranks[x].top().suit==ranks[y].top().suit) return 1; else return 0; } int handle(int n) { if(n>=len) return 0; int k=n; while(k>0) { if(k>=3 && isSame(k-3,n)) k=k-3; else if(k>=1 && isSame(k-1,n)) k=k-1; else break; } if(k!=n) { ranks[k].push(ranks[n].top()); ranks[n].pop(); if(ranks[n].empty()) { mov(n); len--; } return 1; } return 0; } int main() { freopen("127.in","r",stdin); //freopen("127.out","w",stdout); string line; while(getline(cin,line) && line!="#") { //memset(ranks,0,sizeof(ranks)); len=52; int u=0; istringstream in(line); string a; while(in>>a) { ranks[u].push(Card(a[0],a[1])); u++; } getline(cin,line); istringstream in2(line); while(in2>>a) { ranks[u].push(Card(a[0],a[1])); u++; } int flag=1; while(flag==1) { flag=0; for(int i=0;i<len;i++) { if(handle(i)) { flag=1; break; } } } printf("%d ",len); if(len==1) printf("pile remaining:"); else printf("piles remaining:"); for(int i=0;i<len;i++) printf(" %d",ranks[i].size()); printf("\n"); for(int i=0;i<55;i++) while(!ranks[i].empty()) ranks[i].pop(); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值