Sunday, January 27, 2013

UVa 555 - Bridge Hands

Accepted date: 2012-10-11
Ranking (as of 2013-01-27): 299
Language: C++

/*
  UVa 555 - Bridge Hands

  To build using Visual Studio 2008:
    cl -EHsc -O2 bridge_hands.cpp
*/

#include <iostream>
#include <algorithm>
using namespace std;

const int nr_cards = 52, nr_players = 4;

struct card {
  char suit_;
  char rank_;

  bool operator<(const card& c) const;
} cards[nr_players][nr_cards / nr_players];
  // cards[0] are for N, cards[1] are for E, 
  // cards[2] are for S, cards[3] are for W

int nr_cards_delivered[nr_players]; // number of cards delivered so far 

int get_suit(char suit)
{
  switch (suit) {
  case 'C':
    return 0;
  case 'D':
    return 1;
  case 'S':
    return 2;
  default:
    return 3;
  }
}

int get_rank(char rank)
{
  switch (rank) {
  case 'T':
    return 8;
  case 'J':
    return 9;
  case 'Q':
    return 10;
  case 'K':
    return 11;
  case 'A':
    return 12;
  default:
    return rank - '2';
  }
}

bool card::operator<(const card& c) const
{
  int s = get_suit(suit_), cs = get_suit(c.suit_);
  if (s < cs)
    return true;
  else if (s > cs)
    return false;
  else
    return get_rank(rank_) < get_rank(c.rank_);
}

void print_cards(card cards[])
{
  for (int i = 0; i < nr_cards / nr_players; i++)
    cout << ' ' << cards[i].suit_ << cards[i].rank_;
  cout << endl;
}

int main()
{
  while (true) {
    char p;
    cin >> p;
    if (p == '#')
      break;
    int pi;
    switch (p) {
    case 'N':
      pi = 1; break;
    case 'E':
      pi = 2; break;
    case 'S':
      pi = 3; break;
    case 'W':
      pi = 0; break;
    }
    for (int i = 0; i < nr_players; i++)
      nr_cards_delivered[i] = 0;
    for (int i = 0; i < nr_cards; i++, pi = (pi + 1) % nr_players) {
      cin >> cards[pi][nr_cards_delivered[pi]].suit_ >>
        cards[pi][nr_cards_delivered[pi]].rank_;
      nr_cards_delivered[pi]++;
    }
    for (int i = 0; i < nr_players; i++)
      sort(cards[i], cards[i] + nr_cards / nr_players);
    cout << "S:";
    print_cards(cards[2]);
    cout << "W:";
    print_cards(cards[3]);
    cout << "N:";
    print_cards(cards[0]);
    cout << "E:";
    print_cards(cards[1]);
  }
  return 0;
}

No comments:

Post a Comment