#UVa:10315-Poker Hands

灆洢 2012-11-10 20:11:55

照題目要求的做即可,把牌先以大小排好順序會比較好做。

C++(0.008)

/*******************************************************/
/* UVa 10315 Poker Hands                               */
/* Author: Maplewing [at] knightzone.studio            */
/* Version: 2012/11/10                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;

struct Card{
  char value;
  int valueint;
  char suit;
};

struct Rank{
  Rank( int t, int v0, int v1 = 0, int v2 = 0, int v3 = 0, int v4 = 0 ):type(t){
    value[0] = v0;
    value[1] = v1;
    value[2] = v2;
    value[3] = v3;
    value[4] = v4;
  }

  int value[5];
  int type;
};

int valuetoint( char c ){
  if( isdigit(c) ) return c-'0';
  if( c == 'T' ) return 10;
  if( c == 'J' ) return 11;
  if( c == 'Q' ) return 12;
  if( c == 'K' ) return 13;
  if( c == 'A' ) return 14;
  return 0;
}

int cmpRank( Rank a, Rank b ){
  if( a.type > b.type ) return 1;
  if( a.type < b.type ) return -1;
  for( int i = 0 ; i < 5 ; i++ ){
    if( a.value[i] > b.value[i] ) return 1;
    if( a.value[i] < b.value[i] ) return -1;
  }
  return 0;
}

bool isStraight( Card input[] ){
  for( int i = 1 ; i < 5 ; i++ )
    if( input[i].valueint != input[i-1].valueint+1 ) return false;
  return true;
}

bool isFlush( Card input[] ){
  for( int i = 1 ; i < 5 ; i++ )
    if( input[i].suit != input[i-1].suit ) return false;
  return true;
}

bool isFourKind( Card input[] ){
  if( input[0].valueint == input[3].valueint ||
      input[1].valueint == input[4].valueint )
    return true;
  return false;
}

bool isThreeKind( Card input[] ){
  if( input[0].valueint == input[2].valueint ||
      input[1].valueint == input[3].valueint ||
      input[2].valueint == input[4].valueint )
    return true;
  return false;
}

bool isFullHouse( Card input[] ){
  if((input[0].valueint == input[2].valueint &&
      input[3].valueint == input[4].valueint)||
     (input[2].valueint == input[4].valueint &&
      input[0].valueint == input[1].valueint))
    return true;
  return false;
}

Rank pokerHandsRank( Card input[] ){

  if( isFlush(input) && isStraight(input))
    return Rank( 8, input[4].valueint );

  if( isFourKind(input) )
    return Rank( 7, input[1].valueint );

  if( isFullHouse(input) )
    return Rank( 6, input[2].valueint );

  if( isFlush(input) )
    return Rank( 5, input[4].valueint,
      input[3].valueint,
      input[2].valueint,
      input[1].valueint,
      input[0].valueint );

  if( isStraight(input) )
    return Rank( 4, input[4].valueint );

  if( isThreeKind(input) )
    return Rank( 3, input[2].valueint );

/* two pair */
  if( input[0].valueint == input[1].valueint &&
      input[2].valueint == input[3].valueint )
    return Rank( 2, input[3].valueint,
                    input[1].valueint,
                    input[4].valueint );
  if( input[0].valueint == input[1].valueint &&
      input[3].valueint == input[4].valueint )
    return Rank( 2, input[4].valueint,
                    input[1].valueint,
                    input[2].valueint );
  if( input[1].valueint == input[2].valueint &&
      input[3].valueint == input[4].valueint )
    return Rank( 2, input[4].valueint,
                    input[2].valueint,
                    input[0].valueint );
/* pair */
  if( input[0].valueint == input[1].valueint )
    return Rank( 1, input[1].valueint,
                    input[4].valueint,
                    input[3].valueint,
                    input[2].valueint );
  if( input[1].valueint == input[2].valueint )
    return Rank( 1, input[2].valueint,
                    input[4].valueint,
                    input[3].valueint,
                    input[0].valueint );
  if( input[2].valueint == input[3].valueint )
    return Rank( 1, input[3].valueint,
                    input[4].valueint,
                    input[1].valueint,
                    input[0].valueint );
  if( input[3].valueint == input[4].valueint )
    return Rank( 1, input[4].valueint,
                    input[2].valueint,
                    input[1].valueint,
                    input[0].valueint );

  return Rank( 0, input[4].valueint,
                  input[3].valueint,
                  input[2].valueint,
                  input[1].valueint,
                  input[0].valueint );
}

bool cmp( Card a, Card b ){
  if( a.valueint < b.valueint ) return true;
  return false;
}

int main(){

  Card temp;
  while( scanf( "%c%c", &(temp.value), &(temp.suit) ) != EOF ){
    getchar();
    Card black[5], white[5];
    black[0] = temp;
    black[0].valueint = valuetoint(temp.value);

    for( int i = 1 ; i < 5 ; i++ ){
      scanf( "%c%c", &(temp.value), &(temp.suit) );
      getchar();
      black[i] = temp;
      black[i].valueint = valuetoint(temp.value);
    }

    for( int i = 0 ; i < 5 ; i++ ){
      scanf( "%c%c", &(temp.value), &(temp.suit) );
      getchar();
      white[i] = temp;
      white[i].valueint = valuetoint(temp.value);
    }

    sort( black, black+5, cmp );
    sort( white, white+5, cmp );

    Rank black_value = pokerHandsRank( black );
    Rank white_value = pokerHandsRank( white );
    int cmpvalue = cmpRank( black_value, white_value );

    if( cmpvalue > 0 ) printf( "Black wins.\n" );
    else if( cmpvalue < 0 ) printf( "White wins.\n" );
    else printf( "Tie.\n" );
  }
  return 0;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料