/* Problem #2 -- Stanford Local Programming Contest - 2003 Solution by manku@stanford.edu */ #include #include #include char *suit = "CDHS" ; char *face = "23456789TJQKA" ; int a[52] ; int okay (void) { int b[52], i, j, k, leader, new_leader, player ; /* make sure all 52 cards are present */ memset (&b[0], 0, sizeof (int) * 52) ; for (i = 0; i < 52; i++) b[a[i]] = 1 ; for (i = 0; i < 52; i++) if (b[i] != 1) return 0 ; /* find leader for first round */ if (a[0] == 0) leader=0 ; else if (a[13] == 0) leader=1 ; else if (a[26] == 0) leader=2 ; else if (a[39] == 0) leader=3 ; else return 0 ; for (i = 0; i < 13; i++) { new_leader = leader ; for (j = 0; j < 4; j++) { player = (leader + j) % 4 ; if ((a[leader * 13 + i] / 13) != (a[player*13 + i] / 13)) { /* player's card has different suit */ /* so verify that he never plays that suit later on */ for (k = i+1; k < 13; k++) if ((a[player*13 + k] / 13) == (a[leader*13 + i] / 13)) return 0 ; } else { /* player's card has same suit */ if ((a[player*13 + i] % 13) > (a[new_leader*13 + i] % 13)) new_leader = player ; } } leader = new_leader ; } return 1 ; } int main(int argc, char *argv[]) { int i ; char s[20] ; while (1) { if (feof (stdin)) return 0 ; for (i = 0; i < 52; i++) { fscanf (stdin, "%s ", &s[0]) ; a[i] = (strchr(face,s[0]) - face) + (strchr(suit,s[1]) - suit) * 13 ; } fprintf (stdout, "%s\n", okay() ? "Valid" : "Invalid") ; } return 0 ; }