Número mínimo de conversión de agua a tierra para conectar dos islas en una red | conjunto 2

Dada una cuadrícula 2D arr[][] de ‘W’ y ‘L’ donde ‘W’ denota agua y ‘L’ denota tierra, la tarea es encontrar la cantidad mínima de componentes de agua ‘W’ que deben cambiarse a tierra componente ‘L’ para que dos islas queden conectadas.

Una isla es el conjunto de ‘ L ‘ conexas

Nota: Solo puede haber dos islas separadas.

Ejemplos:

Entrada: arr[][] = {{‘W’, ‘L’}, {‘L’, ‘W’}}; 
Salida:
Explicación:  Para el conjunto dado de islas, si cambiamos arr[1][1] a ‘W’ 
, entonces, el conjunto de todas las islas está conectado. 
Por lo tanto, el número mínimo de ‘W’ debe cambiarse a ‘L’ es 1.

Entrada: arr[][] = {{‘W’, ‘L’, ‘W’}, {‘W’, ‘W’, ‘W’}, {‘W’, ‘W’, ‘L’} } 
Salida: 2

 

Enfoque basado en el algoritmo Floodfill: El enfoque basado en el algoritmo Floodfill se analiza en el Conjunto 1 de este artículo.

Enfoque eficiente: este problema se puede resolver mediante el uso de algoritmos DFS y BFS . La idea es usar DFS para encontrar todos los componentes terrestres de una isla y agregar simultáneamente los componentes terrestres limítrofes a la cola que se usará en BFS para expandirse y encontrar el camino más corto a la segunda isla. Siga los pasos que se mencionan a continuación para resolver el problema:

  • Use un bucle anidado para encontrar la primera aparición de ‘L’ en arr[][] .
  • Llame a DFS para encontrar todos los elementos de esta isla y si alguna ‘L’  es un elemento de borde (es decir, rodeado por ‘W’ en al menos un lado) también agréguelo en una cola .
  • Expanda esta isla usando el algoritmo BFS usando la cola y la array visitada creada durante la llamada DFS .
    • En cada nivel aumenta la distancia en 1 .
    • Al usar BFS , encuentre el camino más pequeño desde el borde de una isla hasta la segunda isla.
    • Si el siguiente componente que se agregará a la cola es ‘L’ , devuelva la distancia hasta ahora.

Nota: Todos los elementos de la primera isla también se pueden encontrar utilizando el algoritmo BFS .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program to implement the approach
#include <bits/stdc++.h>
using namespace std;
 
// A class to represent point and dist from first island
class qNode {
public:
    int x, y, dist;
    qNode(int x, int y, int dist)
    {
        this->x = x;
        this->y = y;
        this->dist = dist;
    }
};
 
// Arrays to get the adjacent indices from one index of the
// grid
int dirx[4] = { 0, 1, 0, -1 };
int diry[4] = { 1, 0, -1, 0 };
 
// Global variables for size of array
int R, C;
 
// To check if indices are in matrix
bool isValid(int x, int y)
{
    if (x < 0 || y < 0 || x >= R || y >= C)
        return false;
    return true;
}
 
// Return true if surrounded by water in any of 4 direction
bool isBorder(int i, int j, vector<vector<char> >& arr)
{
    for (int idx = 0; idx < 4; idx++) {
        int x = i + dirx[idx];
        int y = j + diry[idx];
        if (isValid(x, y) && arr[x][y] == 'W')
            return true;
    }
    return false;
}
 
// Function to run DFS
void dfs(int i, int j, vector<vector<bool> >& visited,
         queue<qNode>& q, vector<vector<char> >& arr)
{
    visited[i][j] = true;
    // Checking if it is border component
    if (isBorder(i, j, arr)) {
        q.push(qNode(i, j, 0));
    }
 
    // Calling dfs in all 4 directions
    for (int idx = 0; idx < 4; idx++) {
        int x = i + dirx[idx];
        int y = j + diry[idx];
        if (isValid(x, y) && arr[x][y] == 'L'
            && !visited[x][y])
            dfs(x, y, visited, q, arr);
    }
}
 
// Function to implement BFS
int bfs(queue<qNode>& q, vector<vector<bool> >& visited,
        vector<vector<char> >& arr)
{
    while (q.size() > 0) {
        qNode p = q.front();
        q.pop();
        for (int idx = 0; idx < 4; idx++) {
            int x = p.x + dirx[idx];
            int y = p.y + diry[idx];
 
            // If next unvisited component
            // is land, return dist
            // till of p only
            if (isValid(x, y) && arr[x][y] == 'L'
                && !visited[x][y]) {
                return p.dist;
            }
 
            if (isValid(x, y) && arr[x][y] == 'W'
                && !visited[x][y]) {
                q.push(qNode(x, y, 1 + p.dist));
                visited[x][y] = true;
            }
        }
    }
    return -1;
}
 
// Function to find minimum conversions
int minConversions(vector<vector<char> >& arr)
{
    R = arr.size();
    C = arr[0].size();
 
    // Queue to be used in bfs
    queue<qNode> q;
    vector<vector<bool> > visited(R,
                                  vector<bool>(C, false));
    bool flag = false;
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            if (arr[i][j] == 'L') {
                // Visited first island completely and at
                // same time maintaining visited array and
                // queue
                dfs(i, j, visited, q, arr);
                flag = true;
                break;
            }
        }
 
        // Breaking the nested loop once first island found
        if (flag)
            break;
    }
 
    return bfs(q, visited, arr);
}
 
// Driver code
int main()
{
    // Creating the Grid
    vector<vector<char> > arr = { { 'W', 'L', 'W' },
                                  { 'W', 'W', 'W' },
                                  { 'W', 'W', 'L' } };
 
    // Function call
    cout << minConversions(arr);
    return 0;
}
 
// This code is contributed by abhishekghoshindia.

Java

// Java program to implement the approach
import java.util.*;
 
class GFG {
    static int R;
    static int C;
 
    // A class to represent point and
    // dist from first island
    static class qNode {
        int x;
        int y;
        int dist;
        qNode(int x, int y, int d)
        {
            this.x = x;
            this.y = y;
            this.dist = d;
        }
    }
 
    // Function to find minimum conversions
    static int minConversions(char[][] arr)
    {
        R = arr.length;
        C = arr[0].length;
 
        // Queue to be used in bfs
        Queue<qNode> q = new ArrayDeque<>();
        boolean[][] visited
            = new boolean[R][C];
        boolean flag = false;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (arr[i][j] == 'L') {
 
                    // Visited first island
                    // completely and at
                    // same time maintaining
                    // visited array and queue
                    dfs(i, j, visited, q, arr);
                    flag = true;
                    break;
                }
            }
 
            // Breaking the nested loop
            // once first island found
            if (flag)
                break;
        }
 
        return bfs(q, visited, arr);
    }
 
    // Arrays to get the adjacent indices
    // from one index of thegrid
    static int[] dirx = { 0, 1, 0, -1 };
    static int[] diry = { 1, 0, -1, 0 };
 
    // Function to run DFS
    static void dfs(int i, int j,
                    boolean[][] visited,
                    Queue<qNode> q,
                    char[][] arr)
    {
        visited[i][j] = true;
 
        // Checking if it is border component
        if (isBorder(i, j, arr)) {
            q.add(new qNode(i, j, 0));
        }
 
        // Calling dfs in all 4 directions
        for (int idx = 0; idx < 4; idx++) {
            int x = i + dirx[idx];
            int y = j + diry[idx];
 
            if (isValid(x, y)
                && arr[x][y] == 'L'
                && !visited[x][y]) {
                dfs(x, y, visited, q, arr);
            }
        }
    }
 
    // Return true if surrounded by water
    // in any of 4 direction
    static boolean isBorder(int i, int j,
                            char[][] arr)
    {
        for (int idx = 0; idx < 4; idx++) {
            int x = i + dirx[idx];
            int y = j + diry[idx];
            if (isValid(x, y)
                && arr[x][y] == 'W')
                return true;
        }
        return false;
    }
 
    // Function to implement BFS
    static int bfs(Queue<qNode> q,
                   boolean[][] visited,
                   char[][] arr)
    {
 
        while (q.size() > 0) {
            qNode p = q.remove();
 
            for (int idx = 0; idx < 4;
                 idx++) {
                int x = p.x + dirx[idx];
                int y = p.y + diry[idx];
 
                // If next unvisited component
                // is land, return dist
                // till of p only
                if (isValid(x, y)
                    && arr[x][y] == 'L'
                    && !visited[x][y]) {
                    return p.dist;
                }
                if (isValid(x, y)
                    && arr[x][y] == 'W'
                    && !visited[x][y]) {
 
                    q.add(new qNode(x, y,
                                    p.dist + 1));
                    visited[x][y] = true;
                }
            }
        }
        return -1;
    }
 
    // To check if indices are in matrix
    static boolean isValid(int x, int y)
    {
        if (x < 0 || y < 0
            || x >= R || y >= C)
            return false;
        return true;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        char[][] arr = { { 'W', 'L', 'W' },
                         { 'W', 'W', 'W' },
                         { 'W', 'W', 'L' } };
 
        // Function call
        int ans = minConversions(arr);
        System.out.println(ans);
    }
}

C#

// C# program to implement the approach
using System;
using System.Collections.Generic;
 
public class GFG {
  static int R;
  static int C;
 
  // A class to represent point and
  // dist from first island
  class qNode {
    public int x;
    public int y;
    public int dist;
    public qNode(int x, int y, int d)
    {
      this.x = x;
      this.y = y;
      this.dist = d;
    }
  }
 
  // Function to find minimum conversions
  static int minConversions(char[,] arr)
  {
    R = arr.Length;
    C = arr.GetLength(0);
 
    // Queue to be used in bfs
    Queue<qNode> q = new Queue<qNode>();
    bool[,] visited
      = new bool[R,C];
    bool flag = false;
    for (int i = 0; i < R; i++) {
      for (int j = 0; j < C; j++) {
        if (arr[i,j] == 'L') {
 
          // Visited first island
          // completely and at
          // same time maintaining
          // visited array and queue
          dfs(i, j, visited, q, arr);
          flag = true;
          break;
        }
      }
 
      // Breaking the nested loop
      // once first island found
      if (flag)
        break;
    }
 
    return bfs(q, visited, arr);
  }
 
  // Arrays to get the adjacent indices
  // from one index of thegrid
  static int[] dirx = { 0, 1, 0, -1 };
  static int[] diry = { 1, 0, -1, 0 };
 
  // Function to run DFS
  static void dfs(int i, int j,
                  bool[,] visited,
                  Queue<qNode> q,
                  char[,] arr)
  {
    visited[i,j] = true;
 
    // Checking if it is border component
    if (isBorder(i, j, arr)) {
      q.Enqueue(new qNode(i, j, 0));
    }
 
    // Calling dfs in all 4 directions
    for (int idx = 0; idx < 4; idx++) {
      int x = i + dirx[idx];
      int y = j + diry[idx];
 
      if (isValid(x, y)
          && arr[x,y] == 'L'
          && !visited[x,y]) {
        dfs(x, y, visited, q, arr);
      }
    }
  }
 
  // Return true if surrounded by water
  // in any of 4 direction
  static bool isBorder(int i, int j,
                       char[,] arr)
  {
    for (int idx = 0; idx < 4; idx++) {
      int x = i + dirx[idx];
      int y = j + diry[idx];
      if (isValid(x, y)
          && arr[x,y] == 'W')
        return true;
    }
    return false;
  }
 
  // Function to implement BFS
  static int bfs(Queue<qNode> q,
                 bool[,] visited,
                 char[,] arr)
  {
 
    while (q.Count > 0) {
      qNode p = q.Dequeue();
 
      for (int idx = 0; idx < 4;
           idx++) {
        int x = p.x + dirx[idx];
        int y = p.y + diry[idx];
 
        // If next unvisited component
        // is land, return dist
        // till of p only
        if (isValid(x, y)
            && arr[x,y] == 'L'
            && !visited[x,y]) {
          return p.dist;
        }
        if (isValid(x, y)
            && arr[x,y] == 'W'
            && !visited[x,y]) {
 
          q.Enqueue(new qNode(x, y,
                              p.dist + 1));
          visited[x,y] = true;
        }
      }
    }
    return -1;
  }
 
  // To check if indices are in matrix
  static bool isValid(int x, int y)
  {
    if (x < 0 || y < 0
        || x >= R || y >= C)
      return false;
    return true;
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
    char[,] arr = { { 'W', 'L', 'W' },
                   { 'W', 'W', 'W' },
                   { 'W', 'W', 'L' } };
 
    // Function call
    int ans = minConversions(arr);
    Console.WriteLine(ans);
  }
}
 
// This code is contributed by shikhasingrajput
Producción

2

Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N 2 )

Publicación traducida automáticamente

Artículo escrito por karandeep1234 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *