zoj 1111 Poker Hands

来源:互联网 发布:acrobat pro mac 编辑:程序博客网 时间:2024/04/29 04:49
#include <cstdlib>#include <iostream>using namespace std;struct Card{       char type;       int  value;       Card* next;};void Insert(Card* hand, Card* c){    Card* p = hand->next, *q = hand;    while(p)    {            if (p->value >= c->value) p = NULL;            else            {                q = p; p = p->next;            }    }    c->next = q->next;    q->next = c;}int Straight(Card* hand);int Flush(Card* hand);int ThreeOfKind(Card* hand);/**同花顺 **/int StraightFlush(Card* hand){    if (Flush(hand) == 0) return 0;    if (Straight(hand) == 0) return 0;    return hand->next->value;}/**4张同 **/int FourOfKind(Card* hand){    Card* p = hand->next;    int val = 0;    int cnt = 0;    while (p)    {          if (val != p->value){ val = p->value; cnt=0; }          else { cnt++; if (cnt == 3) return val; }          //cout<<val<<endl;          p = p->next;    }    return 0;}/**2-3同 **/int FullHouse(Card* hand){    int val = ThreeOfKind(hand);    if (val == 0) return 0;    Card* p = hand->next;    while ( val == p->value) p=p->next;    return p->value == p->next->value ? val : 0;}/**清一色 **/int Flush(Card* hand){    Card*p = hand->next;    char type=p->type;    for (p = p->next; p; p = p->next)      if (p->type != type) return 0;    return 1;}/**一条龙 **/int Straight(Card* hand){    Card* p = hand->next; int val=p->value;    for (p = p->next; p ; p = p->next)       if (p->value == val + 1) val++;       else return 0;    return val;}/**三张同**/ int ThreeOfKind(Card* hand){    Card* p = hand->next; int val=p->value;    int cnt=0;    for (p = p->next; p; p = p->next)      if (val == p->value) { cnt++; if (cnt == 2) return val; }      else {           cnt=0;           val = p->value;      }    return 0;}/**两对 **/int TwoPair(Card* hand){    Card* p = hand->next; int val=p->value;    int cnt=0;    for (p = p->next; p; p = p->next)      if (val == p->value) cnt++;      else val = p->value;    return cnt == 2 ? val : 0;}/**对子**/ int Pair(Card* hand){    Card* p = hand->next; int val=p->value;    for (p = p->next; p; p = p->next)      if (val == p->value) return val;      else val = p->value;    return 0;}int HighCard(Card* hand){    Card* p = hand->next;    for (; p->next; p = p->next);    return p->value;}bool Input(Card* hand){     char cd[3];     for (int i = 0; i < 5; i++)     {         if (cin>>cd);         else return false;         Card * c = new Card;         c->type = cd[1];         switch(cd[0])         {           case 'A':                c->value=14;                break;           case 'K':                c->value = 13;                break;           case 'Q':                c->value=12;                break;           case 'J':                c->value=11;                break;           case 'T':                c->value = 10;                break;           default:                 c->value = cd[0] - '0';                 break;           }           Insert(hand, c);     }     return true;}void Clear(Card* hand){     Card* p = hand->next;     while(p)     {             hand->next = p->next;             delete p;             p = hand->next;     }}char* WIN = "White wins./n";char* LOSE = "Black wins./n";char* TIE = "Tie./n";bool Test(int vB, int vW){     if (vB == 0 && vW == 0 ) return false;     if (vB > vW)  cout<<LOSE;     else if (vB < vW) cout<<WIN;     else cout<<TIE;     return true;}void Delete(Card* hand, int val){     Card* q;     for (Card* p = hand; p && p->next; )       if (p->next->value == val)       {           q = p->next;           p->next = q->next;           delete q;       }       else p = p->next;}bool TestTwoPair(Card* black, Card* white){     int vB, vW;     vB = TwoPair(black);     vW = TwoPair(white);     if (vB ==0 && vW==0) return false;     if (vB > vW){ cout<<LOSE; return true; }     if (vB < vW){ cout<<WIN; return true; }     Delete(black, vB);     Delete(white, vW);          vB = Pair(black);     vW = Pair(white);     if (vB > vW){ cout<<LOSE; return true;}     if (vB < vW){ cout<<WIN; return true; }     Delete(black, vB);     Delete(white, vW);          if (black->next->value == white->next->value) cout<<TIE;     else  if(black->next->value > white->next->value) cout<<LOSE;     else cout<<WIN;     return true;}bool TestHighCard(Card* black, Card* white){     int vB, vW;     while (black->next)     {           vB=HighCard(black);           vW=HighCard(white);           if (vB > vW) { cout<<LOSE; return true; }           else if (vB < vW) { cout<<WIN; return true; }           Delete(black, vB); Delete(white, vB);     }     cout<<TIE;     return false;}bool TestPair(Card*black, Card* white){     int vB, vW;     vB = Pair(black); vW = Pair(white);     if (vB > vW){ cout<<LOSE; return true; }     else if (vB < vW){ cout<<WIN; return true; }     if ( vB > 0)     {          Delete(black, vB); Delete(white, vB);     }     return false;}void Compare(Card* black, Card* white){     int vB, vW;          vB = StraightFlush(black);     vW = StraightFlush(white);     if (Test(vB, vW)) return;          vB = FourOfKind(black);     vW = FourOfKind(white);     if (Test(vB, vW)) return;          vB = FullHouse(black);     vW = FullHouse(white);     if (Test(vB, vW)) return;          vB = Flush(black);     vW = Flush(white);     if (vB == vW && vB > 0)     {             TestHighCard(black, white);            return;     }     if (Test(vB, vW)) return;          vB = Straight(black);     vW = Straight(white);     if (Test(vB, vW)) return;          vB = ThreeOfKind(black);     vW = ThreeOfKind(white);     if (Test(vB, vW)) return;          if (TestTwoPair(black, white)) return;     if (TestPair(black, white)) return ;     TestHighCard(black, white);}void Print(Card* hand){     Card* p = hand->next;     while (p)     {           cout<<p->value<<p->type<<":";           p = p->next;     }     cout<<endl;}int main(int argc, char *argv[]){    Card* black = new Card, *white = new Card;    black->value=0; white->value=0;    black->next = white->next = NULL;        while(Input(black))    {         Input(white);         //cout<<"-----------------------------------------"<<endl;        // Print(black);        // Print(white);                  Compare(black, white);         Clear(black);         Clear(white);    }}