// Abhimat Krishna Gautam
// Barrington High School
// Senior Division
// Reversi
// April 2, 2008
import java.util.*;
public class ACSL40809
{
private
static int grid[][];
public
static void main(String[] args)
{
System.out.println("ACSL40809\tReversi\tAbhimat
K Gautam");
for(int run = 1; run <= 5;
run++){
// Input
System.out.println("Input
" + run + ":");
Scanner in = new Scanner(System.in);
grid = new int[8][8];
//Initializing grid
for(int x = 0; x < 8; x++)
{
for(int
y = 0; y < 8; y++)
{
grid[x][y] = 0;
}
}
grid[4][3] = grid[3][4] = 1; // X = 1
grid[3][3] = grid[4][4] = 2; // O = 2
String yAlphabet =
"ABCDEFGH";
int totalFlips = 0;
int moveNum = 0;
String curMove = in.next();
while(!curMove.equals("##"))
{
int
xCoord = Integer.parseInt(curMove.substring(0, 1)) - 1;
int
yCoord = yAlphabet.indexOf(curMove.substring(1, 2));
grid[xCoord][yCoord]
= moveNum%2 + 1;
Coordinate
origPiece = new Coordinate(xCoord, yCoord);
for(int
x = -1; x <= 1; x++)
{
for(int y = -1; y <= 1; y++)
{
if(x==0
&& y==0)
continue;
Coordinate
move = new Coordinate(xCoord + x, yCoord + y);
Coordinate
target = getCoord(origPiece, move);
if(target
!= null)
{
totalFlips
+= countFlips(origPiece, move, target, 0);
}
}
}
fixGrid();
moveNum++;
curMove
= in.next();
}
// Output
System.out.println("Output
" + run + ":\n" + totalFlips + "\n");
}
}
public
static Coordinate getCoord(Coordinate origC, Coordinate newC)
{
//Tests to see if new coordinate is
empty or out of bounds
if(newC.getX() < 0 || newC.getY()
< 0 || newC.getX() > 7 || newC.getY() > 7 ||
grid[newC.getX()][newC.getY()] == 0)
return null;
else
if(grid[newC.getX()][newC.getY()] == grid[origC.getX()][origC.getY()])
return newC;
else
{
Coordinate newerC = new
Coordinate(newC);
if(origC.getX() - newC.getX() >
0)
newerC.setX(newC.getX()
- 1);
else if(origC.getX() - newC.getX()
< 0)
newerC.setX(newC.getX()
+ 1);
if(origC.getY() - newC.getY() >
0)
newerC.setY(newC.getY()
- 1);
else if(origC.getY() - newC.getY()
< 0)
newerC.setY(newC.getY()
+ 1);
return getCoord(origC, newerC);
}
}
public
static int countFlips(Coordinate origC, Coordinate newC, Coordinate target, int
flips)
{
if(newC.equals(target))
return flips;
Coordinate newerC = new
Coordinate(newC);
if(origC.getX() - newC.getX() >
0)
newerC.setX(newC.getX() - 1);
else if(origC.getX() - newC.getX()
< 0)
newerC.setX(newC.getX() + 1);
if(origC.getY() - newC.getY() >
0)
newerC.setY(newC.getY() - 1);
else if(origC.getY() - newC.getY()
< 0)
newerC.setY(newC.getY() + 1);
if(grid[newC.getX()][newC.getY()] ==
grid[origC.getX()][origC.getY()] % 2 + 1)
{
grid[newC.getX()][newC.getY()] = 10
* grid[origC.getX()][origC.getY()];
return countFlips(origC, newerC,
target, flips + 1);
}
else
return countFlips(origC, newerC,
target, flips);
}
public
static void fixGrid()
{
for(int x = 0; x < 8; x++)
{
for(int y = 0; y < 8; y++)
{
if(grid[x][y]
== 10)
grid[x][y] = 1;
else
if(grid[x][y] == 20)
grid[x][y] = 2;
}
}
}
public
static void displayGrid()
{
for(int y = 0; y < 8; y++)
{
for(int x = 0; x < 8; x++)
{
System.out.print(grid[x][y]
+ " ");
}
System.out.println("\n");
}
}
}
class Coordinate
{
private int
x, y;
public
Coordinate()
{
x = 0;
y = 0;
}
public
Coordinate(int nX, int nY)
{
x = nX;
y = nY;
}
public
Coordinate(Coordinate newC)
{
x = newC.getX();
y = newC.getY();
}
public int
getX()
{
return x;
}
public int
getY()
{
return y;
}
public void
setX(int nX)
{
x = nX;
}
public void
setY(int nY)
{
y = nY;
}
public
boolean equals(Coordinate otherC)
{
return (otherC.getX() == x)
&& (otherC.getY() == y);
}
}