Untitled
unknown
plain_text
a year ago
3.6 kB
9
Indexable
Case #1 11 / Case #2 1 / Case #3 31 / Case #4 130 / Case #5 60 / Case #6 44 / Case #7 51 / Case #8 51 / Case #9 47 / Case #10 1231 / Case #11 1205 / Case #12 1224 / Case #13 1226 / Case #14 1204 / Case #15 1234 / Case #16 1256 / Case #17 1207 / Case #18 1227 / Case #19 1201 / Case #20 1199 / Case #21 1176 / Case #22 1205 / Case #23 1218 / Case #24 1215 / Case #25 1207 / Case #26 1180 / Case #27 1159 / Case #28 1175 / Case #29 1177 / Case #30 3129 / Case #31 4849 / Case #32 4740 / Case #33 4721 / Case #34 4713 / Case #35 4838 / Case #36 4792 / Case #37 4675 / Case #38 4702 / Case #39 4778 / Case #40 4833 / Case #41 4774 / Case #42 4778 / Case #43 4785 / Case #44 4828 / Case #45 4764 / Case #46 4776 / Case #47 4763 / Case #48 4724 / Case #49 4836 / Case #50 4723
public class Solution {
static int N, count;
static int id;
static Queue<Point> q;
static int[] sum = new int[6];
static int[] z = new int[100000];
static boolean[][] s;
static boolean[][] v;
static int[][] m;
static int[] a = new int[10000];
static int[] dx = { 0, 0, 1, -1 }, dy = { 1, -1, 0, 0 };
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
N = sc.nextInt();
m = new int[N][N];
v = new boolean[N][N];
s = new boolean[N][N];
q = new Queue<Point>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
m[i][j] = sc.nextInt();
}
}
solve();
System.out.println("Case #" + tc);
System.out.println(count);
}
}
static void solve() throws Exception {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (m[i][j] == 0) {
int sx = i;
int sy = j;
for (int k = 1; k <= 5; k++) {
sum[k] = 0;
}
id = 0;
z[id++] = sx;
z[id++] = sy;
q.reset();
q.enQueue(new Point(sx, sy));
v = new boolean[N][N];
Point p;
while (!q.isEmpty()) {
p = q.peek();
q.deQueue();
for (int d = 0; d < 4; d++) {
int nx = p.x + dx[d];
int ny = p.y + dy[d];
if (isValid(nx, ny) && !v[nx][ny] && !s[nx][ny]) {
if (m[p.x][p.y] == 0) {
v[nx][ny] = true;
if (m[nx][ny] == 0) {
z[id++] = nx;
z[id++] = ny;
}
q.enQueue(new Point(nx, ny));
sum[m[nx][ny]]++;
} else if (m[p.x][p.y] == m[nx][ny]) {
v[nx][ny] = true;
q.enQueue(new Point(nx, ny));
sum[m[nx][ny]]++;
}
}
}
}
int index = 1;
for (int k = 2; k <= 5; k++) {
if (sum[index] <= sum[k]) {
index = k;
}
}
int k = 0;
while (k < id) {
int x = z[k++];
int y = z[k++];
m[x][y] = index;
s[x][y] = true;
}
}
}
}
v = new boolean[N][N];
count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!v[i][j]) {
count++;
q.reset();
q.enQueue(new Point(i, j));
Point pt;
while (!q.isEmpty()) {
pt = q.peek();
q.deQueue();
for (int d = 0; d < dx.length; d++) {
int nx = pt.x + dx[d];
int ny = pt.y + dy[d];
if (isValid(nx, ny) && !v[nx][ny] && m[pt.x][pt.y] == m[nx][ny]) {
v[nx][ny] = true;
q.enQueue(new Point(nx, ny));
}
}
}
}
}
}
}
static boolean isValid(int x, int y) {
if (x >= 0 && y >= 0 && x < N && y < N) {
return true;
}
return false;
}
}Editor is loading...
Leave a Comment