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); }}