Saturday, December 7, 2024

 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