UVa 127 - "Accordian" Patience(模拟)

给出扑克牌堆,当堆顶的扑克与它左边或者左边第三堆的堆顶的扑克match(suit或rank相同),这张牌就移过去,优先移动三格,优先移动最左边牌堆顶的牌。

一开始用的string,stack,vector模拟的,在UVa上2.899s过了,后来学校有这个题,时间限制1s,进行了优化,VJ上测试0.999过的。

UVa 127 - "Accordian" Patience(模拟)_第1张图片

优化后代码:

#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
#include<stack>
using namespace std;
stack<char *>pile;
vector<stack<char *> > piles,emp(52);
bool read(){
    piles=emp;
    char *s=(char *)malloc(3);
    scanf("%s",s);
    if(s[0]=='#') return false;
    piles[0].push(s);
    for(int i=1;i<52;++i){
        s=(char *)malloc(3);
        scanf("%s",s);
        piles[i].push(s);
    }
    return true;
}
bool match(char *a,char *b){
    return (a[0]==b[0]||a[1]==b[1]);
}
int move(int i){
    if(i>2&&match(piles[i].top(),piles[i-3].top())){
        piles[i-3].push(piles[i].top());
        piles[i].pop();
        if(piles[i].empty()) piles.erase(piles.begin()+i);
        return 4;
    }
    if(i>0&&match(piles[i].top(),piles[i-1].top())){
        piles[i-1].push(piles[i].top());
        piles[i].pop();
        if(piles[i].empty()) piles.erase(piles.begin()+i);
        return 2;
    }
    return 0;
}
void solve(){
    int k;
    for(int i=1;i<piles.size();i++){
        k=move(i);
        if(k) i-=k;
    }
    return;
}
void print(){
    printf("%d%s",piles.size(),piles.size()==1?" pile remaining: ":" piles remaining: ");
    for(int i=0;i<piles.size();++i){
        if(i) printf(" ");
        printf("%d",piles[i].size());
    }
    printf("\n");
    return;
}
int main(){
    while(read()){
        solve();
        print();
    }
    return 0;
}

原代码:

#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
stack<string>pile;
vector<stack<string> >piles;
bool read(){
    ios::sync_with_stdio(false);
    string s;
    cin>>s;
    if(s=="#") return false;
    piles.push_back(pile);
    piles[0].push(s);
    for(int i=1;i<52;i++){
        cin>>s;
        piles.push_back(pile);
        piles[i].push(s);
    }
    return true;
}
bool match(string a,string b){
    return (a[0]==b[0]||a[1]==b[1]);
}
int move(int i){
    if(i>2&&match(piles[i].top(),piles[i-3].top())){
        piles[i-3].push(piles[i].top());
        piles[i].pop();
        if(piles[i].empty()) piles.erase(piles.begin()+i);
        return 4;
    }
    if(i>0&&match(piles[i].top(),piles[i-1].top())){
        piles[i-1].push(piles[i].top());
        piles[i].pop();
        if(piles[i].empty()) piles.erase(piles.begin()+i);
        return 2;
    }
    return 0;
}
void solve(){
    int k;
    for(int i=0;i<piles.size();i++){
        k=move(i);
        if(k) i-=k;
    }
    return;
}
void print(){
    ios::sync_with_stdio(false);
    cout<<piles.size();
    cout<<(piles.size()==1?" pile remaining: ":" piles remaining: ");
    for(int i=0;i<piles.size();i++){
        if(i) cout<<" ";
        cout<<piles[i].size();
    }
    cout<<endl;
    piles.clear();
    return;
}
int main(){
    while(read()){
        solve();
        print();
    }
    return 0;
}


你可能感兴趣的:(uva)