Uva Accordian Patience
来源:互联网 发布:java服务器端开发教程 编辑:程序博客网 时间:2024/05/16 05:21
这个题确实让我恶心到了,搞了两天,各种TLE,蛋碎,学C++以来第一次用STL ,就当是熟悉一下吧,不过codeblocks的提示确实是有些问题。。。
思路:直接模拟,每次移动之后一定要从头开始才能确保按顺序移动,直接模拟一定要用scanf输入,这很关键....
基本上算是卡着时间AC的
这个题确实让我恶心到了,搞了两天,各种TLE,蛋碎,学C++以来第一次用STL ,就当是熟悉一下吧,不过codeblocks的提示确实是有些问题。。。思路:直接模拟,每次移动之后一定要从头开始才能确保按顺序移动,直接模拟一定要用scanf输入,这很关键....基本上算是卡着时间AC的#include <iostream>#include <cstring>#include <vector>#include <stack>#include <cstdio>using namespace std;struct Card{ char x,y;}; bool ismove(const Card a,const Card b){ if(a.x == b.x || a.y == b.y) return true; return false;}int main(){ vector<stack<Card> > cards; char s1,s2; while(scanf(" %c%c",&s1,&s2) && s1!='#') { Card cad; cad.x=s1; cad.y=s2; stack<Card> temp; temp.push(cad); cards.push_back(temp); if(cards.size()==52) { while(true) { int pos; for(pos=0;pos!=cards.size();++pos) { if(pos>2 && ismove(cards[pos].top(),cards[pos-3].top())) { cards[pos-3].push(cards[pos].top()); cards[pos].pop(); break; } if(pos>0 && ismove(cards[pos].top(),cards[pos-1].top())) { cards[pos-1].push(cards[pos].top()); cards[pos].pop(); break; } } if(pos==cards.size()) break; if(cards[pos].empty()) { cards.erase(cards.begin()+pos); } } if(cards.size()==1) printf("%d pile remaining:",cards.size()); else printf("%d piles remaining:",cards.size()); for(int i=0;i<cards.size();++i) { printf(" %d",cards[i].size()); } printf("\n"); cards.clear(); } } return 0;}