Thứ Năm, 10 tháng 1, 2019

UVa 00220 - Othello (follow the game rules, a bit tedious)

Link: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=156
Sol:
import java.util.Scanner;
class Board {
public int m, n;
char map[][];
public Board(int m, int n) {
this.m = m;
this.n = n;
map = new char[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
map[i][j] = '-';
}
public Board(Board board) {
this.m = board.m;
this.n = board.n;
map = new char[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
map[i][j] = board.getItem(i, j);
}
public char getItem(int x, int y) {
return map[x][y];
}
public void setItem(int x, int y, char item) {
//this can be really strange, need to test it more
map[x][y] = item;
}
public boolean makeMove(int i, int j, char player) {
if (!isThePositionLegal(i, j, player))
return false;
char newMap[][] = new char[m][n];
for (int k = 0; k < m; k++)
for (int h = 0; h < n; h++)
newMap[k][h] = map[k][h];
for (int dirx = -1; dirx <= 1; dirx++)
for (int diry = -1; diry <= 1; diry++)
if (checkDirection(i, j, dirx, diry, player)) {
for (int k = 1; k < 7; k++) {
int x = i + dirx * k;
int y = j + diry * k;
if (map[x][y] == player)
break;
newMap[x][y] = player;
}
}
newMap[i][j] = player;
this.map = newMap;
return true;
}
public void printStatus() {
int black = 0, white = 0;
for (int k = 0; k < m; k++)
for (int h = 0; h < n; h++)
if (map[k][h] == 'B')
black++;
else if (map[k][h] == 'W')
white++;
System.out.printf("Black -%3d White -%3d\n",black, white);
}
public void listPossibleMoves(char player) {
StringBuilder builder = new StringBuilder();
boolean legalMoveFound = false;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (isThePositionLegal(i, j, player)) {
if (!legalMoveFound) {
legalMoveFound = true;
} else {
builder.append(' ');
}
builder.append("(" + (i + 1) + "," + (j + 1) + ")");
}
}
}
if (legalMoveFound) {
System.out.println(builder.toString());
} else {
System.out.println("No legal move.");
}
}
public boolean isThePositionLegal(int i, int j, char player) {
if (!isOnTheBoard(i, j) || map[i][j] != '-')
return false;
//System.out.println("is position legal " + i + " " + j);
//System.out.println(this);
for (int dirx = -1; dirx <= 1; dirx++)
for (int diry = -1; diry <= 1; diry++) {
//we are checking for dirx = 0 and diry = 0, but that will return correct result
//System.out.println("dir " + dirx + " " + diry);
if (checkDirection(i, j, dirx, diry, player))
return true;
}
return false;
}
private boolean checkDirection(int i, int j, int dirx, int diry, char player) {
int bracketNum = 0;
char enemyPlayer = (player=='B')?'W':'B';
int x, y;
for (int k = 1; k < 7; k++) {
x = i + dirx * k;
y = j + diry * k;
if (!isOnTheBoard(x, y) || map[x][y] == '-') {
return false;
}
if (map[x][y] == enemyPlayer) {
bracketNum++;
}
if (map[x][y] == player) {
return bracketNum != 0;
}
}
return false;
}
private boolean isOnTheBoard(int i, int j) {
return i >= 0 && j >= 0 && i < m && j < n;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
builder.append(map[i][j]);
}
builder.append("\n");
}
return builder.toString();
}
}
public class Main {
public static void main(String[] args) throws Exception {
//Scanner in = new Scanner (new FileReader(new File("proba.txt")));
Scanner in = new Scanner(System.in);
String line;
int tc = Integer.parseInt(in.nextLine());
int m = 8, n = 8;
while (tc-- != 0) {
Board board = new Board(m, n);
for (int i = 0; i < m; i++) {
line = in.nextLine().trim();
for (int j = 0; j < n; j++) {
char c = line.charAt(j);
board.setItem(i, j, c);
}
}
char curPlayer = in.nextLine().trim().charAt(0);
boolean gameOver = false;
while (!gameOver) {
//System.out.println(board);
line = in.nextLine().trim();
switch (line.charAt(0)) {
case 'L':
board.listPossibleMoves(curPlayer);
break;
case 'Q':
System.out.print(board);
gameOver = true;
break;
case 'M':
int i = (int)(line.charAt(1) - '0');
int j = (int)(line.charAt(2) - '0');
if (!board.makeMove(i - 1, j - 1, curPlayer)) {
curPlayer = (curPlayer=='B')?'W':'B';
board.makeMove(i - 1, j - 1, curPlayer);
}
board.printStatus();
curPlayer = (curPlayer=='B')?'W':'B';
break;
}
}
if (tc != 0)
System.out.println();
}
}
}

Không có nhận xét nào:

Đăng nhận xét

Bài G - Educatioal Round 62

Đề bài: Bạn được cho 1 đồ thị vô hướng đặc biệt. Nó bao gồm $2n$ đỉnh được đánh số từ 1 đến 2n. Dưới đây là một số đặc tính của đồ thị: + ...