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

UVa 00379 - HI-Q (follow problem description)

Link: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=show_problem&problem=315
Sol:
import java.util.Scanner;
import java.io.*;
/*
Seems hard but really straight forword:
1) Use matrix with 0 on borders so you don't have to check if the move is out of the Board
2) Make a list of x, y cordinates for every position from 1..33 so you can
traverse from 33..1 and not use double loop.
*/
class Board {
public int m, n;
boolean map[][];
public Board(int m, int n) {
this.m = m;
this.n = n;
map = new boolean[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
map[i][j] = false;
}
public boolean getItem(int x, int y) {
return map[x][y];
}
public void setItem(int x, int y, boolean item) {
map[x][y] = item;
}
public void doTheThing() {
boolean hasMove = true;
while (hasMove) {
hasMove = doTheMove();
}
}
private boolean doTheMove() {
for (int i = 33; i > 0; i--) {
int bestFit = -1;
int bestx = -1, besty = -1;
int x = Main.rconvertx[i];
int y = Main.rconverty[i];
if (map[x][y] == true)
continue;
//UP
if (map[x-1][y] == true && map[x-2][y] == true) {
int p = Main.convert[x-2][y];
if (p > bestFit) {
bestFit = p;
bestx = -1;
besty = 0;
}
}
//Down
if (map[x+1][y] == true && map[x+2][y] == true) {
int p = Main.convert[x+2][y];
if (p > bestFit) {
bestFit = p;
bestx = 1;
besty = 0;
}
}
//Left
if (map[x][y-1] == true && map[x][y-2] == true) {
int p = Main.convert[x][y-2];
if (p > bestFit) {
bestFit = p;
bestx = 0;
besty = -1;
}
}
//Right
if (map[x][y+1] == true && map[x][y+2] == true) {
int p = Main.convert[x][y+2];
if (p > bestFit) {
bestFit = p;
bestx = 0;
besty = 1;
}
}
if (bestFit == -1)
continue;
map[x + bestx * 2][y + besty * 2] = false;
map[x + bestx][y + besty] = false;
map[x][y] = true;
return true;
}
return false;
}
public int getScore() {
int sum = 0;
for (int i = 33; i > 0; i--) {
if (map[Main.rconvertx[i]][Main.rconverty[i]] == true)
sum += i;
}
return sum;
}
@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]?"1":"0");
}
builder.append("\n");
}
return builder.toString();
}
}
public class Main {
public static int convert[][] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 2, 3, 0, 0, 0},
{0, 0, 0, 4, 5, 6, 0, 0, 0},
{0, 7, 8, 9, 10, 11, 12, 13, 0},
{0, 14, 15, 16, 17, 18, 19, 20, 0},
{0, 21, 22, 23, 24, 25, 26, 27, 0},
{0, 0, 0, 28, 29, 30, 0, 0, 0},
{0, 0, 0, 31, 32, 33, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
};
public static int rconvertx[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7};
public static int rconverty[] = {0, 3, 4, 5, 3, 4, 5, 1, 2, 3, 4, 5, 6, 7,
1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 3, 4, 5, 3, 4, 5};
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
int tc = in.nextInt();
int n;
System.out.println("HI Q OUTPUT");
while (tc-- != 0) {
Board board = new Board(9, 9);
while (true) {
n = in.nextInt();
if (n == 0)
break;
board.setItem(rconvertx[n], rconverty[n], true);
}
board.doTheThing();
System.out.println(board.getScore());
}
System.out.println("END OF OUTPUT");
}
}

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ị: + ...