UVa127,"Accordian" Patience

注意1堆的时候,pile后面没有s!!!!因为这个WA了一次,否则就1A了

犯了一个很幼稚很幼稚的错误,申请ans[]后玩了吧ans置0,结果调了好长好长时间,本来是敲完就能过的T T啊啊啊啊啊啊,一个多小时没了啊

附上我调试时写的代码(把每一次运转都输出了= =一个一个看的,真心用了好长时间,头都大了)

#include <iostream>

#include <cstdio>

#include <string>

#include <cstring>

#include <algorithm>

#include <stack>

#define maxn 100

using namespace std;

struct Node

{

    int suit,rank;

    //friend ostream& operator<<(ostream& cout,const Point& Node);

};

stack<Node> s[53];

int init()

{

    for (int i=0;i<53;i++) while (!s[i].empty()) s[i].pop();

    char ch1,ch2;

    cin>>ch1;

    if (ch1=='#') return 0;

    cin>>ch2;

    Node u;

   if (isalpha(ch1))

        switch (ch1){

            case 'A':u.rank=1;break;

            case 'T':u.rank=10;break;

            case 'J':u.rank=11;break;

            case 'Q':u.rank=12;break;

            case 'K':u.rank=13;break;

        }

        else u.rank=ch1-'0';

    switch (ch2){

        case 'C':u.suit=1;break;

        case 'D':u.suit=2;break;

        case 'H':u.suit=3;break;

        case 'S':u.suit=4;break;

    }

    s[1].push(u);

    for (int i=2;i<=52;i++){

        cin>>ch1>>ch2;

        if (isalpha(ch1))

            switch (ch1){

                case 'A':u.rank=1;break;

                case 'T':u.rank=10;break;

                case 'J':u.rank=11;break;

                case 'Q':u.rank=12;break;

                case 'K':u.rank=13;break;

            }

            else u.rank=ch1-'0';

        switch (ch2){

            case 'C':u.suit=1;break;

            case 'D':u.suit=2;break;

            case 'H':u.suit=3;break;

            case 'S':u.suit=4;break;

        }

        s[i].push(u);

    }

}

int match(Node a,Node b){

    if (a.suit==b.suit||a.rank==b.rank) return 1;

    return 0;

}

ostream& operator<<(ostream& cout,const Node& p) {

    cout<<p.rank<<(char)(p.suit+'B')<<" ";

}

int tot(){

    int t=0;

    for (int i=1;i<=52;i++)

        t+=s[i].size();

    cout<<" "<<t;

}

int main()

{

    while (init()){

        int i=2,k,j;

        while(i<=52){

            if (s[i].empty()){

                i++;

                continue;

            }

             k=i,j=0;

            while (k>=1&&j<3) {k--;if(!s[k].empty()) j++;}

            if(j==3) if(match(s[k].top(),s[i].top())){

                //cout<<s[i].top()<<"->"<<s[k].top();

                s[k].push(s[i].top());

                s[i].pop();

                //cout<<" "<<s[k].top();

                //tot();cout<<endl;

                i=k;

                continue;

            }

            k=i;j=0;

            while (k>=1&&j<1){k--;if(!s[k].empty()) j++;}

            if(j==1)if(match(s[k].top(),s[i].top())){

                //cout<<s[i].top()<<"->"<<s[k].top();

                s[k].push(s[i].top());

                s[i].pop();

                //cout<<" "<<s[k].top();

                //tot();cout<<endl;

                i=k;

                continue;

            }

            i++;

        }

        int ans[100],top=0;

        memset(ans,0,sizeof(ans));

        for (i=1;i<=52;i++)

            if (s[i].size()!=0){

                top++;

                ans[top]=s[i].size();

            }

        if (top==1)cout<<top<<" pile remaining:";

        else cout<<top<<" piles remaining:";

        for (i=1;i<=top;i++) cout<<" "<<ans[i];

        cout<<endl;

    }

}
View Code

 

你可能感兴趣的:(uva)