Problem
statement: Given a wire grid of size N * N with N-1 horizontal edges and N-1
vertical edges along the X and Y axis respectively, and a wire burning out
every instant as per the given order using three matrices A, B, C such that the
wire that burns is
(A[T], B[T] + 1),
if C[T] = 0 or
(A[T] + 1, B[T]),
if C[T] = 1
Determine the
instant after which the circuit is broken
public static boolean
checkConnections(int[] h, int[] v, int N) {
boolean[][] visited = new
boolean[N][N];
dfs(h, v, visited,0,0);
return visited[N-1][N-1];
}
public static void dfs(int[]h, int[]v,
boolean[][] visited, int i, int j) {
int N = visited.length;
if (i < N && j < N
&& i>= 0 && j >= 0 && !visited[i][j]) {
visited[i][j] = true;
if (v[i * (N-1) + j] == 1) {
dfs(h, v, visited, i, j+1);
}
if (h[i * (N-1) + j] == 1) {
dfs(h, v, visited, i+1, j);
}
if (i > 0 &&
h[(i-1)*(N-1) + j] == 1) {
dfs(h,v, visited, i-1, j);
}
if (j > 0 && h[(i *
(N-1) + (j-1))] == 1) {
dfs(h,v, visited, i, j-1);
}
}
}
public static int burnout(int N, int[] A,
int[] B, int[] C) {
int[] h = new int[N*N];
int[] v = new int[N*N];
for (int i = 0; i < N*N; i++) { h[i]
= 1; v[i] = 1; }
for (int i = 0; i < N; i++) {
h[(i * (N)) + N - 1] = 0;
v[(N-1) * (N) + i] = 0;
}
System.out.println(printArray(h));
System.out.println(printArray(v));
for (int i = 0; i < A.length; i++) {
if (C[i] == 0) {
v[A[i] * (N-1) + B[i]] = 0;
} else {
h[A[i] * (N-1) + B[i]] = 0;
}
if (!checkConnections(h,v, N)) {
return i+1;
}
}
return -1;
}
int[] A = new int[9];
int[] B = new int[9];
int[] C = new int[9];
A[0] = 0; B [0] = 0; C[0] = 0;
A[1] = 1; B [1] = 1; C[1] = 1;
A[2] = 1; B [2] = 1; C[2] = 0;
A[3] = 2; B [3] = 1; C[3] = 0;
A[4] = 3; B [4] = 2; C[4] = 0;
A[5] = 2; B [5] = 2; C[5] = 1;
A[6] = 1; B [6] = 3; C[6] = 1;
A[7] = 0; B [7] = 1; C[7] = 0;
A[8] = 0; B [8] = 0; C[8] = 1;
System.out.println(burnout(9, A, B,
C));
1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
8
Alternatively,
public static boolean burnWiresAtT(int N,
int[] A, int[] B, int[] C, int t) {
int[] h = new int[N*N];
int[] v = new int[N*N];
for (int i = 0; i < N*N; i++) { h[i]
= 1; v[i] = 1; }
for (int i = 0; i < N; i++) {
h[(i * (N)) + N - 1] = 0;
v[(N-1) * (N) + i] = 0;
}
System.out.println(printArray(h));
System.out.println(printArray(v));
for (int i = 0; i < t; i++) {
if (C[i] == 0) {
v[A[i] * (N-1) + B[i]] = 0;
} else {
h[A[i] * (N-1) + B[i]] = 0;
}
}
return checkConnections(h, v, N);
}
public static int binarySearch(int N, int[]
A, int[] B, int[] C, int start, int end) {
if (start == end) {
if (!burnWiresAtT(N, A, B, C,
end)){
return end;
}
return -1;
} else {
int mid = (start + end)/2;
if (burnWiresAtT(N, A, B, C, mid))
{
return binarySearch(N, A, B, C,
mid + 1, end);
} else {
return binarySearch(N, A, B, C,
start, mid);
}
}
}
1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
8
No comments:
Post a Comment