[Java] The Castle

/* 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();
	}
}

Guess you like

Origin blog.csdn.net/weixin_41714373/article/details/112623458