Sol:
import java.util.Scanner; | |
import java.io.*; | |
class Board { | |
public int m, n; | |
int map[][]; | |
int colum[]; | |
int columLen; | |
public Board(int m, int n) { | |
this.m = m; | |
this.n = n; | |
map = new int[m][n]; | |
for (int i = 0; i < m; i++) | |
for (int j = 0; j < n; j++) | |
map[i][j] = -1; | |
colum = new int[n]; | |
for (int i = 0; i < n; i++) | |
colum[i] = m; | |
columLen = n; | |
} | |
public int getItem(int x, int y) { | |
return map[x][y]; | |
} | |
public void setItem(int x, int y, int item) { | |
map[x][y] = item; | |
} | |
private boolean isOnTheBoard(int i, int j) { | |
return i >= 0 && j >= 0 && i < m && j < n; | |
} | |
@Override | |
public String toString() { | |
//int max = 0; | |
//for (int i = 0; i < columLen; i++) | |
//if (colum[i] > max) | |
//max = colum[i]; | |
StringBuilder builder = new StringBuilder(); | |
for (int i = 0; i < m; i++) { | |
builder.append(" "); | |
for (int j = 0; j < n; j++) { | |
builder.append((map[m - i - 1][j] == -1?" ":map[m-i-1][j]) + (j < (n-1)?" ":"")); | |
} | |
builder.append("\n"); | |
} | |
return builder.toString(); | |
} | |
public void removeRegion(int x, int y) { | |
//for (int i = 0; i < columLen; i++) { | |
// System.out.print(colum[i] + " "); | |
//} | |
//System.out.println(); | |
if (isValidRegion(x, y)) { | |
boolean compress = removeCells(x, y, map[x][y]); | |
//System.out.println("Remove"); | |
//System.out.println(this); | |
compressRows(); | |
//System.out.println("c rows: "); | |
//System.out.println(this); | |
if (compress) { // if after this removal there are no items inside some colum | |
//System.out.println("Compress col"); | |
compressColums(); | |
} | |
} | |
} | |
private boolean removeCells(int x, int y, int value) { | |
if (!isOnTheBoard(x, y) || map[x][y] != value) | |
return false; | |
boolean result = false; | |
map[x][y] = -1; | |
if (--colum[y] == 0) { // now we have one less number in this colm | |
//System.out.println("No more items inside colum"); | |
result = true; // if no items left in coulum, do the copress of colums | |
} | |
result = removeCells(x-1, y, value) || result; | |
result = removeCells(x+1, y, value) || result; | |
result = removeCells(x, y-1, value) || result; | |
result = removeCells(x, y+1, value) || result; | |
return result; | |
} | |
private boolean isValidRegion(int x, int y) { | |
if (!isOnTheBoard(x, y)) | |
return false; | |
if (map[x][y] == -1) | |
return false; | |
// Check if there is one more number same as one on x, y in the connected cells | |
// this is to check if reagon has at least 2 elements. | |
if (isOnTheBoard(x-1, y) && map[x-1][y] == map[x][y]) | |
return true; | |
if (isOnTheBoard(x+1, y) && map[x+1][y] == map[x][y]) | |
return true; | |
if (isOnTheBoard(x, y-1) && map[x][y-1] == map[x][y]) | |
return true; | |
if (isOnTheBoard(x, y+1) && map[x][y+1] == map[x][y]) | |
return true; | |
//This is reagon with single value | |
return false; | |
} | |
private void compressColums() { | |
int k = 0; | |
for (int i = 0; i < columLen; i++) { | |
if (colum[i] != 0) { | |
if (i != k) { | |
colum[k] = colum[i]; | |
//move colum | |
for (int j = 0; j < m; j++) { | |
map[j][k] = map[j][i]; | |
map[j][i] = -1; | |
} | |
} | |
k++; | |
} | |
} | |
columLen = k; | |
} | |
private void compressRows(){ | |
for (int j = 0; j < columLen; j++) { | |
if (colum[j] == 0) | |
continue; | |
int k = 0; | |
for (int i = 0; i < m; i++) { | |
if (map[i][j] != -1) { | |
if (i != k) { | |
map[k][j] = map[i][j]; | |
map[i][j] = -1; | |
} | |
k++; | |
} | |
} | |
} | |
} | |
} | |
public class Main { | |
public static void main(String[] args) throws Exception { | |
Scanner in = new Scanner(System.in); | |
String line; | |
int tc = 0, m, n; | |
while (true) { | |
m = in.nextInt(); | |
n = in.nextInt(); | |
if (m == 0 || n == 0) | |
break; | |
if (++tc != 1) { | |
System.out.println(); | |
} | |
Board board = new Board(m, n); | |
for (int i = 0; i < m; i++) { | |
for (int j = 0; j < n; j++) { | |
board.setItem(i, j, in.nextInt()); | |
} | |
} | |
System.out.println("Grid " + tc + "."); | |
//System.out.println(board); | |
int x, y; | |
while (true) { | |
x = in.nextInt(); | |
y = in.nextInt(); | |
if (x == 0 && y == 0) | |
break; | |
//System.out.println("Move: " + (x-1) + " " + (y-1)); | |
board.removeRegion(x-1, y-1); | |
//System.out.println("After move"); | |
//System.out.println(board); | |
} | |
if (board.columLen != 0) { | |
System.out.print(board); | |
} | |
else | |
System.out.println(" Game Won"); | |
} | |
} | |
} |
Không có nhận xét nào:
Đăng nhận xét