// Jeffrey Lu
// Holmdel High
School
// Senior 3
Division
// 2012-2013
Contest #4
import java.io.*;
import
java.util.*;
//2S 2C 3C 4C 5C
6C 9D
// 4H 5H 6H 8C 8S
JD JC
// 3H 7H JS 3C AH
// AH 3D JS QH 2C
// 7H 8H JS 8D AS
// 2C 5D 7S 9H TC
// 3H 7H 8D JS AH
class Rummy
{
public static void main(String[] args)
throws IOException
{
BufferedReader kb = new
BufferedReader(new InputStreamReader(System.in));
ArrayList<Integer> values =
new ArrayList<Integer>();
ArrayList<Integer> suits = new
ArrayList<Integer>();
final int row = 4;
final int col = 13;
int[][] hand = new int[row][col];
System.out.println("Please
enter the 7 cards in the player's hand: ");
StringTokenizer str1 = new
StringTokenizer(kb.readLine(), ", ");
while (str1.hasMoreTokens())
{
String card =
str1.nextToken();
hand[valueOf(card.charAt(1))][valueOf(card.charAt(0))]
= 1;
}
for (int l = 0; l < 5; l++)
{
int[][] deck = new
int[row][col];
for (int i = 0; i < row;
i++)
for (int j = 0; j <
col; j++)
deck[i][j] =
hand[i][j];
System.out.println("Please
enter the 5 remaining cards in the deck: ");
StringTokenizer str2 = new
StringTokenizer(kb.readLine(), ", ");
boolean flag = false;
for (int i = 0; i < 5; i++)
{
if
(shouldTerminate(deck, row, col))
{
flag = true;
break;
}
//terminating condition
String card =
str2.nextToken();
int r =
valueOf(card.charAt(1));
int c =
valueOf(card.charAt(0));
deck[r][c] = 1;
if (makeSet(deck, row,
col, c) || makeRun(deck, row, col, r, c))
{
// remove minimal
card
RemoveMin(deck,
row, col);
}
else
{
// don't add
deck[r][c] = 0;
}
}
if (!flag)
PrintAll(deck, row,
col);
}
}
public static void printDeck(int[][] deck,
int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col;
j++)
if (deck[i][j] == 1)
System.out.print(CharOf(j,
false) + "" + CharOf(i, true) + " ");
System.out.println();
}
public static boolean makeSet(int[][]
deck, int row, int col, int c)
{
int count = 0;
for (int i = 0; i < row; i++)
{
if (deck[i][c] == 1)
count++;
}
return (count == 3 || count == 4);
}
public static boolean makeRun(int[][]
deck, int row, int col, int r, int c)
{
int count = 0;
int max = 0;
int min = 100;
for (int x = 0; x < col; x++)
{
if ((deck[r][x] == 1)
&& !makeSet(deck, row, col, x))
{
count++;
if (x < min)
{
min = x;
}
if (x > max)
{
max = x;
}
}
}
//printDeck(deck, row, col);
//System.out.println("min =
" + min + " max = " + max);
return ((count == 3 || count == 4)
&& (count == (max - min + 1)));
/*
int l = c;
while (l >= 0 &&
deck[r][l] != 0) l--;
int count = 0;
for (int i = l + 1; i < col
&& deck[r][i] != 0; i++)
{
count++;
}
return (count == 3 || count == 4);
*/
}
public static void RemoveMin(int[][] deck,
int row, int col)
{
boolean found = false;
for
(int c = 0; c < col; c++)
{
for
(int i = row - 1; i >= 0; i--)
{
if (deck[i][c] == 1)
{
if (!makeSet(deck,
row, col, c) && !makeRun(deck, row, col, i, c))
{
deck[i][c] =
0;
return;
}
}
}
}
if (!found)
{
for (int c = 0; c < col;
c++)
{
for
(int i = row - 1; i > 0; i--)
{
if (deck[i][c] ==
1)
{
deck[i][c]
= 0;
return;
}
}
}
}
}
public static boolean
shouldTerminate(int[][] deck, int row, int col)
{
ArrayList<String> handArray =
new ArrayList<String>();
for (int c = 0; c < col; c++)
{
for
(int r = row - 1; r >= 0; r--)
{
if (deck[r][c] == 1)
{
handArray.add(CharOf(c,
false) + "" + CharOf(r, true));
}
}
}
outer: for (int x = 0; x < 7;
x++)
{
for (int y = x + 1; y < 7;
y++)
{
for (int z = y + 1; z
< 7; z++)
{
ArrayList<String>
handArrayTemp = new ArrayList<String>();
ArrayList<String>
temp = new ArrayList<String>();
for (int i = 0; i
< handArray.size(); i++)
{
handArrayTemp.add(handArray.get(i));
}
temp.add(handArrayTemp.get(x));
temp.add(handArrayTemp.get(y));
temp.add(handArrayTemp.get(z));
handArrayTemp.remove(z);
handArrayTemp.remove(y);
handArrayTemp.remove(x);
if ((isSet(temp)
|| isRun(temp)) && (isSet(handArrayTemp) || isRun(handArrayTemp)))
{
if
(isSet(handArrayTemp))
{
for
(int m = handArrayTemp.size() - 1; m >= 0; m--)
{
System.out.print(handArrayTemp.get(m)
+ " ");
}
}
else
{
for (int m = 0; m <
handArrayTemp.size(); m++)
{
System.out.print(handArrayTemp.get(m)
+ " ");
}
}
if
(isSet(temp))
{
for
(int m = temp.size() - 1; m >= 0; m--)
{
System.out.print(temp.get(m)
+ " ");
}
}
else
{
for
(int m = 0; m < temp.size(); m++)
{
System.out.print(temp.get(m)
+ " ");
}
}
System.out.println();
return true;
}
}
}
}
return false;
}
public static boolean isSet
(ArrayList<String> a)
{
char value = a.get(0).charAt(0);
for (String s: a)
{
if (s.charAt(0) != value)
{
return false;
}
}
return true;
}
public static boolean isRun
(ArrayList<String> a)
{
char suit = a.get(0).charAt(1);
int counter = 0;
int max =
valueOf(a.get(0).charAt(0));
int min =
valueOf(a.get(0).charAt(0));
for (String s: a)
{
if (s.charAt(1) == suit)
{
counter++;
}
if (valueOf(s.charAt(0)) >
max)
{
max =
valueOf(s.charAt(0));
}
if (valueOf(s.charAt(0)) <
min)
{
min =
valueOf(s.charAt(0));
}
}
if (counter == a.size() &&
a.size() == max - min + 1)
{
return true;
}
return false;
}
public static void PrintAll(int[][] deck,
int row, int col)
{
Print4Run(deck,
row, col);
Print4Set(deck,
row, col);
Print3Run(deck,
row, col);
Print3Set(deck,
row, col);
PrintOthers(deck,
row, col);
System.out.println();
}
public static void Print4Run(int[][] deck,
int row, int col)
{
for
(int r = 0; r < row; r++)
{
int count = 0;
int start = -1;
for
(int c = 0; c < col; c++)
{
if (deck[r][c] == 1)
{
if (start == -1)
start = c;
count++;
}
else
{
start = -1;
count = 0;
}
if (count == 4)
{
for (int i =
start; i < start + count; i++)
{
System.out.print(CharOf(i,
false) + "" + CharOf(r, true) + " ");
deck[r][i] =
0;
}
return;
}
}
}
}
public static void Print3Run(int[][] deck,
int row, int col)
{
for
(int r = 0; r < row; r++)
{
int count = 0;
int start = -1;
for
(int c = 0; c < col; c++)
{
if (deck[r][c] == 1)
{
if (start == -1)
start = c;
count++;
}
else
{
start = -1;
count = 0;
}
if (count == 3)
{
for (int i =
start; i < start + count; i++)
{
System.out.print(CharOf(i,
false) + "" + CharOf(r, true) + " ");
deck[r][i] =
0;
}
// continue to see
if there is another run
start = -1;
count = 0;
}
}
}
}
public static void Print4Set(int[][] deck,
int row, int col)
{
for
(int c = 0; c < col; c++)
{
int count = 0;
for
(int r = 0; r < row; r++)
{
if (deck[r][c] == 1)
{
count++;
}
}
if (count == 4)
{
for (int i = 0; i <
count; i++)
{
System.out.print(CharOf(c,
false) + "" + CharOf(i, true) + " ");
deck[i][c] = 0;
}
return;
}
}
}
public static void Print3Set(int[][] deck,
int row, int col)
{
for
(int c = 0; c < col; c++)
{
int count = 0;
for
(int r = 0; r < row; r++)
{
if (deck[r][c] == 1)
{
count++;
}
}
if (count == 3)
{
for
(int r = 0; r < row; r++)
{
if (deck[r][c] ==
1)
{
System.out.print(CharOf(c,
false) + "" + CharOf(r, true) + " ");
deck[r][c] =
0;
}
}
}
}
}
public static void PrintOthers(int[][]
deck, int row, int col)
{
for
(int c = col - 1; c > 0; c--)
{
for
(int r = 0; r < row; r++)
{
if (deck[r][c] == 1)
{
System.out.print(CharOf(c,
false) + "" + CharOf(r, true) + " ");
deck[r][c] = 0;
}
}
}
}
public static int valueOf(char c)
{
int v = 0;
switch (c)
{
case 'A':
v = 1;
break;
case 'T':
v = 10;
break;
case 'J':
v = 11;
break;
case 'Q':
v = 12;
break;
case 'K':
v = 13;
break;
case 'S':
v = 1;
break;
case 'H':
v = 2;
break;
case 'C':
v = 3;
break;
case 'D':
v = 4;
break;
default:
v = c - '0';
break;
}
return (v - 1);
}
public static char CharOf(int v, boolean
isSuit)
{
char c = '0';
v++;
if (isSuit)
{
switch (v)
{
case 1:
c = 'S';
break;
case 2:
c = 'H';
break;
case 3:
c = 'C';
break;
case 4:
c = 'D';
break;
default:
break;
}
}
else
{
switch (v)
{
case 1:
c = 'A';
break;
case
10:
c = 'T';
break;
case 11:
c = 'J';
break;
case 12:
c = 'Q';
break;
case 13:
c = 'K';
break;
default:
c = (char)(v +
'0');
break;
}
}
return c;
}
}