/* High Card: Highest value card. One Pair: Two cards of the same value. Two Pairs: Two different pairs. Three of a Kind: Three cards of the same value. Straight: All cards are consecutive values. Flush: All cards of the same suit. Full House: Three of a kind and a pair. Four of a Kind: Four cards of the same value. Straight Flush: All cards are consecutive values of same suit. Royal Flush: Ten, Jack, Queen, King, Ace, in same suit. */ #include <vector> #include <utility> using namespace std; bool isRoyalFlush(vector<pair<int, char> > card) { int RoyalFlush = 10+11+12+13+14; char suit = card[0].second; int cardnum = 0; for (size_t i=0; i<card.size(); i++) { if (card[i].first<10 || card[i].second!=suit) return false; cardnum += card[i].first; } if (cardnum!=RoyalFlush) return false; return true; } bool isStraightFlush(vector<pair<int, char> > card) { char suit = card[0].second; vector<int> cardnum; for (size_t i=0; i<card.size(); i++) { if (card[i].second!=suit) return false; cardnum.push_back(card[i].first); } vector<int>::iterator begin = cardnum.begin(); vector<int>::iterator end = cardnum.end(); cardnum.sort(begin, end); for (size_t i=0; i<cardnum.size()-1; i++) { if (cardnum[i]+1!=cardnum[i+1]) return false; } return true; } bool isFourofaKind(vector<pair<int, char> > card) { int cardnum[14] = {4}; for (size_t i=0; i<cardnum.size(); i++) cardnum[cardnum[i].first]--; for (int i = 2; i<14; i++) if (cardnum[i]==0) return true; return false; } bool isFullHouse(vector<pair<int, char> > card) { int cardnum[14]; } 还是不对,某个判定条件出了问题。 一开始选用的数据结构也不好,崩溃。 /* High Card: Highest value card. One Pair: Two cards of the same value. Two Pairs: Two different pairs. Three of a Kind: Three cards of the same value. Straight: All cards are consecutive values. Flush: All cards of the same suit. Full House: Three of a kind and a pair. Four of a Kind: Four cards of the same value. Straight Flush: All cards are consecutive values of same suit. Royal Flush: Ten, Jack, Queen, King, Ace, in same suit. */ #include <windows.h> #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> using namespace std; int isRoyalFlush(int card[]) { if ( card[14]==5 || card[15]==5 || card[16]==5 || card[17]==5 ) if ( card[1]==1 && card[10]==1 && card[11]==1 && card[12]==1 && card[13]==1 ) return 1; return 0; } int isStraightFlush(int card[]) { int maxcard = 0; if ( card[14]==5 || card[15]==5 || card[16]==5 || card[17]==5 ) { for (int i=2; i<=9; i++) { if (card[i]==1) { maxcard = card[i+4]; for (int j=i+1; j<=i+4; j++) { if (card[i]!=1) return 0; } } } } return maxcard; } int isFourofaKind(int card[]) { int maxcard = 0; int mincard = 0; bool get4kind = false; for (int i=1; i<=13; i++) { if (card[i]==4) { get4kind = true; maxcard = i; if (i==1) { maxcard = i+13; } } if (card[i]!=0 && card[i]!=4) { mincard = i; } } if (get4kind) { return 14*maxcard + mincard; } return 0; } int isFullHouse(int card[]) { bool getPair = false; bool getThree = false; int maxcard = 0; int mincard = 0; for (int i=1; i<=13; i++) { if (card[i]==2) { getPair = true; mincard = i; } if ( card[i]==3) { getThree = true; maxcard = i; } } if (getPair==true && getThree==true) { if (card[1]==3) { maxcard = 14; } if (card[1]==2) { mincard = 14; } return 14*maxcard+mincard; } return 0; } int isFlush(int card[]) { if ( card[14]==5 || card[15]==5 || card[16]==5 || card[17]==5 ) return 1; return 0; } int isStraight(int card[]) { int maxcard = 0; for (int i=2; i<=9; i++) { if (card[i]==1) { maxcard = card[i+4]; for (int j=i+1; j<=i+4; j++) { if (card[i]!=1) return 0; } } } return maxcard; if ( card[1]==1 && card[10]==1 && card[11]==1 && card[12]==1 && card[13]==1 ) return 14; return 0; } int isThreeofaKind(int card[]) / { int maxcard = 0; int midcard = 0; int mincard = 0; bool get3kind = false; bool getmincard = false; for (int i=2; i<=13; i++) { if ( card[i]==3) { get3kind = true; maxcard = i; } if ( card[i]!=0 || card[i]!=3 ) { if (!getmincard) { mincard = i; getmincard = true; } if (getmincard) { midcard = i; } } } if (card[1]==3) maxcard = 14; if (card[1]!=0) midcard = 14; if (get3kind) { return 196*14*maxcard + 14*midcard + mincard; } return 0; } int isTwoPairs(int card[]) { int getPair = 0; int maxPair = 0; int minPair = 0; int mincard = 0; for (int i=1; i<=13; i++) { if (card[i]==2) { if (getPair==0) { minPair = i; } if (i>maxPair) { maxPair = i; } getPair++; } if (card[i]!=2 && card[i]!=0) mincard = i; } if (card[1]==3) { maxPair = 14; } if (getPair==2) { return 196*14*maxPair+14*minPair+mincard; } return 0; } int isOnePair(int card[]) { card[14] = card[1]; int paircard = 0; int tot = 1; int factor = 14; bool getPair = false; for (int i=2; i<=14; i++) { if (card[i]==2) { paircard = i; getPair = true; } if (card[i]!=2 && card[i]!=0) { tot *= i*factor; factor += 14; } } if (getPair) return 38416*paircard + tot; return 0; //int seccard = 0; //int thdcard = 0; //bool get3rdcard = false; //for (int i=1; i<=13; i++) //{ // if (card[i]!=0 && card[i]!=2) // { // seccard = i; // if (!get3rdcard) // { // thdcard = i; // get3rdcard = true; // } // // } // else if (card[i]==2) // { // return 196*i+14*seccard+thdcard ; // } //} //if (card[1]==2) // return 196*14+14*seccard+thdcard ; return 0; } int isHighCard(int card[]) { if (card[1]!=0) return 14; for (int i=13; i>=1; i--) { if (card[i]!=0) { return i; } } return 0; } int char2int(char s) { if (s=='S') return 14; else if (s=='H') return 15; else if (s=='C') return 16; else if (s=='D') return 17; else if (s=='T') return 10; else if (s=='J') return 11; else if (s=='Q') return 12; else if (s=='K') return 13; else if (s=='A') return 1; else return s-48; } bool Problem54(int p1[], int p2[]) { if (isRoyalFlush(p1) > isRoyalFlush(p2)) { cout << " p1 win" << endl; return true; } else if (isRoyalFlush(p1) < isRoyalFlush(p2)) { cout << " p2 win" << endl; return false; } if (isStraightFlush(p1) > isStraightFlush(p2)) { cout << " p1 win" << endl; return true; } else if (isStraightFlush(p1) < isStraightFlush(p2)) { cout << " p2 win" << endl; return false; } if (isFourofaKind(p1) > isFourofaKind(p2)) { cout << " p1 win" << endl; return true; } else if (isFourofaKind(p1) < isFourofaKind(p2)) { cout << " p2 win" << endl; return false; } if (isFullHouse(p1) > isFullHouse(p2)) { cout << " p1 win" << endl; return true; } else if (isFullHouse(p1) < isFullHouse(p2)) { cout << " p2 win" << endl; return false; } if (isFlush(p1) > isFlush(p2)) { cout << " p1 win" << endl; return true; } else if (isFlush(p1) < isFlush(p2)) { cout << " p2 win" << endl; return false; } if (isThreeofaKind(p1) > isThreeofaKind(p2)) { cout << " p1 win" << endl; return true; } if (isThreeofaKind(p1) < isThreeofaKind(p2)) { cout << " p2 win" << endl; return false; } if (isTwoPairs(p1) > isTwoPairs(p2)) { cout << " p1 win" << endl; return true; } if (isTwoPairs(p1) < isTwoPairs(p2)) { cout << " p2 win" << endl; return false; } if (isOnePair(p1) > isOnePair(p2)) { cout << " p1 win" << endl; return true; } else if (isOnePair(p1) < isOnePair(p2)) { cout << " p2 win" << endl; return false; } if (isHighCard(p1) > isHighCard(p2)) { cout << " p1 win" << endl; return true; } cout << " p2 win" << endl; return false; } int main() { ifstream file; file.clear(); file.open("poker.txt", ios::in); //poker.txt if (!file.is_open()) { cerr << "cann't open the file."<< '/n'; return -1; } int counter = 0; int h = 0; while (!file.eof()) { cout << h ; h++; string line; int player1card[18] = {0}; int player2card[18] = {0}; getline(file, line); int len = line.size(); for (int i=0; i<len; i++) { if (i<len/2 && i%3==0) { player1card[char2int(line[i])]++; player1card[char2int(line[i+1])]++; } if (i>=len/2 && i%3==0) { player2card[char2int(line[i])]++; player2card[char2int(line[i+1])]++; } } if (Problem54(player1card,player2card)) counter++; } cout << "P1 wins = " << counter << endl; return 0; } 答案是出来了 这道题目的关键不在于实行效率,而是数据结构以及考虑问题的全面性 程序前期一定得好好规划,不然到后期越改越乱,心情越糟糕。导致不可控状态 /* High Card: Highest value card. One Pair: Two cards of the same value. Two Pairs: Two different pairs. Three of a Kind: Three cards of the same value. Straight: All cards are consecutive values. Flush: All cards of the same suit. Full House: Three of a kind and a pair. Four of a Kind: Four cards of the same value. Straight Flush: All cards are consecutive values of same suit. Royal Flush: Ten, Jack, Queen, King, Ace, in same suit. */ #include <windows.h> #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> using namespace std; void printCard(int card[]) { for (int i=15; i<=18; i++) if ( card[i]==5) { cout << "同花" ; return ; } for (int i=2; i<=14; i++) { if (card[i]==1) { if (i==14) { cout << "A"; } else if (i==13) { cout << "K"; } else if (i==12) { cout << "Q"; } else if (i==11) { cout << "J"; } else if (i==10) { cout << "O"; } else cout << i; } if (card[i]==2) { if (i==14) { cout << "AA"; } else if (i==13) { cout << "KK"; } else if (i==12) { cout << "QQ"; } else if (i==11) { cout << "JJ"; } else if (i==10) { cout << "OO"; } else cout << i << i; } if (card[i]==3) { if (i==14) { cout << "AAA"; } else if (i==13) { cout << "KKK"; } else if (i==12) { cout << "QQQ"; } else if (i==11) { cout << "JJJ"; } else if (i==10) { cout << "OOO"; } else cout << i << i << i; } if (card[i]==4) { if (i==14) { cout << "AAAA"; } else if (i==13) { cout << "KKKK"; } else if (i==12) { cout << "QQQQ"; } else if (i==11) { cout << "JJJJ"; } else if (i==10) { cout << "OOOO"; } else cout << i << i << i << i; } } } int isRoyalFlush(int card[]) { if ( card[15]==5 || card[16]==5 || card[17]==5 || card[18]==5 ) if ( card[14]==1 && card[10]==1 && card[11]==1 && card[12]==1 && card[13]==1 ) return 1; return 0; } int isStraightFlush(int card[]) { int maxcard = 0; if ( card[15]==5 || card[16]==5 || card[17]==5 || card[18]==5 ) { for (int i=2; i<=10; i++) { if (card[i]==1) { maxcard = card[i+4]; for (int j=i+1; j<=i+4; j++) { if (card[i]!=1) return 0; } } } } return maxcard; } int isFourofaKind(int card[]) { int maxcard = 0; int mincard = 0; bool get4kind = false; for (int i=2; i<=14; i++) { if (card[i]==4) { get4kind = true; maxcard = i; } if (card[i]!=0 && card[i]!=4) { mincard = i; } } if (get4kind) { return 14*maxcard + mincard; } return 0; } int isFullHouse(int card[]) { bool getPair = false; bool getThree = false; int maxcard = 0; int mincard = 0; for (int i=2; i<=14; i++) { if (card[i]==2) { getPair = true; mincard = i; } if ( card[i]==3) { getThree = true; maxcard = i; } } if (getPair==true && getThree==true) { return 14*maxcard+mincard; } return 0; } int isFlush(int card[]) { if ( card[15]==5 || card[16]==5 || card[17]==5 || card[18]==5 ) return 1; return 0; } int isStraight(int card[]) { if ( card[14]==1 && card[2]==1 && card[3]==1 && card[4]==1 && card[5]==1 ) return 5; if ( card[2]==1 && card[3]==1 && card[4]==1 && card[5]==1 && card[6]==1 ) return 6; if ( card[3]==1 && card[4]==1 && card[5]==1 && card[6]==1 && card[7]==1 ) return 7; if ( card[4]==1 && card[5]==1 && card[6]==1 && card[7]==1 && card[8]==1 ) return 8; if ( card[5]==1 && card[6]==1 && card[7]==1 && card[8]==1 && card[9]==1 ) return 9; if ( card[7]==1 && card[8]==1 && card[9]==1 && card[10]==1 && card[11]==1 ) return 10; if ( card[8]==1 && card[9]==1 && card[10]==1 && card[11]==1 && card[12]==1 ) return 11; if ( card[9]==1 && card[10]==1 && card[11]==1 && card[12]==1 && card[13]==1 ) return 12; if ( card[10]==1 && card[11]==1 && card[12]==1 && card[13]==1 && card[14]==1 ) return 13; return 0; } int isThreeofaKind(int card[]) / { int maxcard = 0; int midcard = 0; int mincard = 0; bool get3kind = false; bool getmincard = false; for (int i=2; i<=14; i++) { if ( card[i]==3) { get3kind = true; maxcard = i; } if ( card[i]!=0 || card[i]!=3 ) { if (!getmincard) { mincard = i; getmincard = true; } if (getmincard) { midcard = i; } } } if (get3kind) { return 196*14*maxcard + 14*midcard + mincard; } return 0; } int isTwoPairs(int card[]) { int getPair = 0; int maxPair = 0; int minPair = 0; int mincard = 0; for (int i=2; i<=14; i++) { if (card[i]==2) { if (getPair==0) { minPair = i; } if (i>maxPair) { maxPair = i; } getPair++; } if (card[i]!=2 && card[i]!=0) mincard = i; } if (getPair==2) { return 196*14*maxPair+14*minPair+mincard; } return 0; } int isOnePair(int card[]) { int onePair = 0; int card2 = 0; int card3 = 0; int card4 = 0; bool getPair = false; bool get2ndcard = false; bool get3rdcard = false; bool get4thcard = false; for (int i=2; i<=14; i++) { if (card[i]!=0 && card[i]!=1) { onePair = i; getPair = true; } if (card[i]!=0 && card[i]!=2) { if (!get2ndcard) { card2 = i; get2ndcard = true; } if (!get3rdcard) { card3 = i; get3rdcard = true; } if (!get4thcard) { card4 = i; get4thcard = true; } } } if (getPair) { return 2744*onePair+196*card2 + 14*card3 + card4; } return 0; } int isHighCard(int card[]) { for (int i=14; i>=2; i--) { if (card[i]!=0) { return i; } } return 0; } int char2int(char s) { if (s=='S') return 15; else if (s=='H') return 16; else if (s=='C') return 17; else if (s=='D') return 18; else if (s=='T') return 10; else if (s=='J') return 11; else if (s=='Q') return 12; else if (s=='K') return 13; else if (s=='A') return 14; else return s-48; } bool Problem54(int p1[], int p2[]) { //1 if (isRoyalFlush(p1) > isRoyalFlush(p2)) { /* cout << " p1 win isRoyalFlush " ; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isRoyalFlush(p1) < isRoyalFlush(p2)) { /* cout << " p2 win isRoyalFlush "; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return false; } //2 if (isStraightFlush(p1) > isStraightFlush(p2)) { /* cout << " p1 win isStraightFlush "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isStraightFlush(p1) < isStraightFlush(p2)) { /* cout << " p2 win "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return false; } //3 if (isFourofaKind(p1) > isFourofaKind(p2)) { /* cout << " p1 win isFourofaKind "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isFourofaKind(p1) < isFourofaKind(p2)) { /* cout << " p2 win "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return false; } //4 if (isFullHouse(p1) > isFullHouse(p2)) { /* cout << " p1 win isFullHouse "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isFullHouse(p1) < isFullHouse(p2)) { /* cout << " p2 win "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return false; } //5 if (isFlush(p1) > isFlush(p2)) { /* cout << " p1 win isFlush "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isFlush(p1) < isFlush(p2)) { /* cout << " p2 win " ; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return false; } //lost if (isStraight(p1) > isStraight(p2)) { /* cout << " p1 win isStraight "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } else if (isStraight(p1) < isStraight(p2)) { /* cout << " p2 win " ; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return false; } //6 if (isThreeofaKind(p1) > isThreeofaKind(p2)) { /* cout << " p1 win isThreeofaKind "; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return true; } else if (isThreeofaKind(p1) < isThreeofaKind(p2)) { /* cout << " p2 win "; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return false; } //7 if (isTwoPairs(p1) > isTwoPairs(p2)) { /* cout << " p1 win isTwoPairs "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } if (isTwoPairs(p1) < isTwoPairs(p2)) { /* cout << " p2 win " ; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return false; } //8 if (isOnePair(p1) > isOnePair(p2)) { /* cout << " p1 win isOnePair "; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return true; } else if (isOnePair(p1) < isOnePair(p2)) { /* cout << " p2 win ";; printCard(p1); cout << " vs "; printCard(p2); cout << endl;*/ return false; } //9 if (isHighCard(p1) > isHighCard(p2)) { /* cout << " p1 win isHighCard "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return true; } /* cout << " p2 win "; printCard(p1); cout << " vs "; printCard(p2); cout << endl; */ return false; } int main() { DWORD start = GetTickCount(); ifstream file; file.clear(); file.open("poker.txt", ios::in); //poker.txt if (!file.is_open()) { cerr << "cann't open the file."<< '/n'; return -1; } int counter = 0; //int l = 1; while (!file.eof()) { //cout << l ; //l++; string line; int player1card[19] = {0}; int player2card[19] = {0}; getline(file, line); int len = line.size(); for (int i=0; i<len; i++) { if (i<len/2 && i%3==0) { player1card[char2int(line[i])]++; player1card[char2int(line[i+1])]++; } if (i>=len/2 && i%3==0) { player2card[char2int(line[i])]++; player2card[char2int(line[i+1])]++; } } if (Problem54(player1card,player2card)) counter++; } cout << "P1 wins = " << counter << endl; file.close(); DWORD end = GetTickCount(); std::cout << "the running time = " << end - start << " ms." << '/n'; return 0; }