/* Use the slash-star style comments or the system won't see your
identification information */
/*
ID: lincans1
LANG: JAVA
TASK: castle
*/
import java.io.*;
import java.util.*;
class Room {
private int id;
private boolean west = false;
private boolean north = false;
private boolean east = false;
private boolean south = false;
public Room (int val) {
if (val >= 8) {
south = true;
val -= 8;
}
if (val >= 4) {
east = true;
val -= 4;
}
if (val >= 2) {
north = true;
val -= 2;
}
if (val >= 1) {
west = true;
}
}
public boolean isWest() {
return west;
}
public boolean isNorth() {
return north;
}
public boolean isEast() {
return east;
}
public boolean isSouth() {
return south;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class castle {
private final Room[][] rooms;
private int DFS (int id, int i, int j, boolean[][] visited) {
visited[i][j] = true;
Room room = rooms[i][j];
room.setId(id);
int size = 1;
if (!room.isEast() && !visited[i][j + 1]) {
size += DFS(id, i, j+1, visited);
}
if (!room.isWest() && !visited[i][j - 1]) {
size += DFS(id, i, j-1, visited);
}
if (!room.isSouth() && !visited[i + 1][j]) {
size += DFS(id, i+1, j, visited);
}
if (!room.isNorth() && !visited[i - 1][j]) {
size += DFS(id, i-1, j, visited);
}
return size;
}
private int count (int N, int M, Map<Integer, Integer> map) {
boolean[][] visited = new boolean[N][M];
int num = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (!visited[i][j]) {
int size = DFS(num, i, j, visited);
map.put(num, size);
num++;
}
}
}
return num;
}
private void findWall(int N, int M, Map<Integer, Integer> map, PrintWriter out) {
int maxSize = 0;
int iWall = 0, jWall = 0;
boolean isEast = false;
// from SouthWest to NorthEast
for (int j = 0; j < M; j++) {
for (int i = N - 1; i >= 0; i--) {
Room room = rooms[i][j];
int id = room.getId();
if (room.isNorth() && i - 1 >= 0) {
int nextRoomId = rooms[i - 1][j].getId();
if (id != nextRoomId && maxSize < map.get(id) + map.get(nextRoomId)) {
maxSize = map.get(id) + map.get(nextRoomId);
iWall = i + 1;
jWall = j + 1;
isEast = false;
}
}
if (room.isEast() && j + 1 < M) {
int nextRoomId = rooms[i][j + 1].getId();
if (id != nextRoomId && maxSize < map.get(id) + map.get(nextRoomId)) {
maxSize = map.get(id) + map.get(nextRoomId);
iWall = i + 1;
jWall = j + 1;
isEast = true;
}
}
}
}
out.println(maxSize);
out.println(iWall + " " + jWall + " " + (isEast ? "E" : "N"));
}
public castle() throws IOException {
// Use BufferedReader rather than RandomAccessFile; it's much faster
BufferedReader f = new BufferedReader(new FileReader("castle.in"));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("castle.out")));
// Use StringTokenizer vs. readLine/split -- lots faster
StringTokenizer st = new StringTokenizer(f.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
this.rooms = new Room[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(f.readLine());
for (int j = 0; j < M; j++) {
rooms[i][j] = new Room(Integer.parseInt(st.nextToken()));
}
}
Map<Integer, Integer> map = new HashMap<>();
int num = count(N, M, map);
out.println(num);
int maxSize = 0;
for (Integer i : map.values()) {
maxSize = Math.max(i, maxSize);
}
out.println(maxSize);
findWall(N, M, map, out);
out.close();
f.close();
}
public static void main (String [] args) throws IOException {
new castle();
}
}
[Java] The Castle
Guess you like
Origin blog.csdn.net/weixin_41714373/article/details/112623458
Recommended
Ranking