Número máximo de torres no atacantes que se pueden colocar en un tablero de ajedrez N*N

Dado un número entero N tal que hay un tablero de ajedrez de tamaño N*N y una array pos[][] de K pares de números enteros que representan las posiciones de las torres colocadas en el tablero de ajedrez dado. La tarea es encontrar el número máximo de torres con sus posiciones que se pueden colocar en el tablero de ajedrez dado de manera que ninguna torre ataque a otra torre. Imprime las posiciones en orden lexicográfico.

Ejemplos:

Entrada: N = 4, K = 2, pos[][] = {{1, 4}, {2, 2}} 
Salida: 

3 1 
4 3 
Explicación: 
Solo se pueden colocar 2 torres más en el tablero dado y sus posiciones son (3, 1) y (4, 3).
Entrada: N = 5, K = 0, pos[][] = {} 
Salida: 

1 1 
2 2 
3 3 
4 4 
5 5 
Explicación: 
Dado que el tablero de ajedrez está vacío, podemos colocar 5 torres en el tablero dado y sus posiciones son (1, 1), (2, 2), (3, 3), (4, 4) y (5, 5).

Enfoque Ingenuo: El enfoque más simple es tratar de colocar una torre en cada posición vacía del tablero de ajedrez y verificar si ataca las torres ya colocadas o no. A continuación se muestran los pasos:

  1. Inicialice una array 2D M[][] de tamaño N*N para representar el tablero de ajedrez y coloque las torres ya dadas en él.
  2. Atraviese la array completa M[][] y verifique si la i-ésima fila y la j-ésima columna contienen alguna torre
  3. Si la i-ésima fila y la j-ésima columna no contienen ninguna torre, entonces se coloca una torre allí y esta celda se agrega al resultado.
  4. De lo contrario, muévase a la siguiente celda vacía en el tablero de ajedrez.

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

Enfoque eficiente: el enfoque se basa en la idea de que se puede colocar un máximo de (N – K) torres en el tablero de ajedrez de acuerdo con el Principio del casillero . A continuación se muestran los pasos:

  1. Dado que dos de las torres dadas no se atacan entre sí, todas las filas dadas en la entrada deben ser únicas. De manera similar, todas las columnas dadas en la entrada deben ser únicas.
  2. Por lo tanto, coloque las torres solo en N – K filas no utilizadas y N – K columnas no utilizadas.
  3. Por lo tanto, la configuración lexicográficamente mínima se puede lograr emparejando la fila más pequeña sin usar con la columna más pequeña sin usar, la segunda fila más pequeña sin usar con la segunda columna más pequeña sin usar, y así sucesivamente.

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

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the maximum rooks
// and their positions
void countRooks(int n, int k,
                int pos[2][2])
 {
     int row[n] = {0};
     int col[n] = {0};
 
     // Initialize row and col array
     for (int i = 0; i < n; i++)
     {
         row[i] = 0;
         col[i] = 0;
     }
 
     // Marking the location of
     // already placed rooks
     for (int i = 0; i < k; i++)
     {
         row[pos[i][0] - 1] = 1;
         col[pos[i][1] - 1] = 1;
     }
 
     int res = n - k;
 
     // Print number of non-attacking
     // rooks that can be placed
     cout << res << " " << endl;
 
     // To store the placed rook
     // location
     int ri = 0, ci = 0;
     while (res-- > 0)
     {
         // Print lexicographically
         // smallest order
         while (row[ri] == 1)
         {
             ri++;
         }
         while (col[ci] == 1)
         {
             ci++;
         }
         cout << (ri + 1) << " " <<
                 (ci + 1) << " " <<endl;
         ri++;
         ci++;
     }
 }
 
// Driver Code
int main()
{
 // Size of board
    int N = 4;
 
    // Number of rooks already placed
    int K = 2;
 
    // Position of rooks
    int pos[2][2] = {{1, 4}, {2, 2}};
 
    // Function call
    countRooks(N, K, pos);
}
// This code is contributed by shikhasingrajput

Java

// Java program for the above approach
public class GFG {
 
    // Function to print the maximum rooks
    // and their positions
    private static void countRooks(int n, int k,
                                   int pos[][])
    {
        int row[] = new int[n];
        int col[] = new int[n];
 
        // Initialize row and col array
        for (int i = 0; i < n; i++) {
            row[i] = 0;
            col[i] = 0;
        }
 
        // Marking the location of
        // already placed rooks
        for (int i = 0; i < k; i++) {
            row[pos[i][0] - 1] = 1;
            col[pos[i][1] - 1] = 1;
        }
 
        int res = n - k;
 
        // Print number of non-attacking
        // rooks that can be placed
        System.out.println(res + " ");
 
        // To store the placed rook
        // location
        int ri = 0, ci = 0;
        while (res-- > 0) {
 
            // Print lexicographically
            // smallest order
            while (row[ri] == 1) {
                ri++;
            }
            while (col[ci] == 1) {
                ci++;
            }
            System.out.println(
                (ri + 1)
                + " " + (ci + 1)
                + " ");
            ri++;
            ci++;
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        // Size of board
        int N = 4;
 
        // Number of rooks already placed
        int K = 2;
 
        // Position of rooks
        int pos[][] = { { 1, 4 }, { 2, 2 } };
 
        // Function call
        countRooks(N, K, pos);
    }
}

Python3

# Python3 program for the above approach
# Function to print maximum rooks
# and their positions
def countRooks(n, k, pos):
     
    row = [0 for i in range(n)]
    col = [0 for i in range(n)]
 
    # Marking the location of
    # already placed rooks
    for i in range(k):
        row[pos[i][0] - 1] = 1
        col[pos[i][1] - 1] = 1
 
    res = n - k
 
    # Print number of non-attacking
    # rooks that can be placed
    print(res)
 
    # To store the placed rook
    # location
    ri = 0
    ci = 0
     
    while (res > 0):
 
        # Print lexicographically
        # smallest order
        while (row[ri] == 1):
            ri += 1
             
        while (col[ci] == 1):
            ci += 1
             
        print((ri + 1), (ci + 1))
         
        ri += 1
        ci += 1
        res -= 1
 
# Driver Code
if __name__ == '__main__':
 
    # Size of board
    N = 4
 
    # Number of rooks already placed
    K = 2
 
    # Position of rooks
    pos= [ [ 1, 4 ], [ 2, 2 ] ]
 
    # Function call
    countRooks(N, K, pos)
 
# This code is contributed by mohit kumar 29

C#

// C# program for the above approach
using System;
class GFG{
 
    // Function to print the maximum rooks
    // and their positions
    private static void countRooks(int n, int k,
                                   int [, ]pos)
    {
        int []row = new int[n];
        int []col = new int[n];
 
        // Initialize row and col array
        for (int i = 0; i < n; i++)
        {
            row[i] = 0;
            col[i] = 0;
        }
 
        // Marking the location of
        // already placed rooks
        for (int i = 0; i < k; i++)
        {
            row[pos[i, 0] - 1] = 1;
            col[pos[i, 1] - 1] = 1;
        }
 
        int res = n - k;
 
        // Print number of non-attacking
        // rooks that can be placed
        Console.WriteLine(res + " ");
 
        // To store the placed rook
        // location
        int ri = 0, ci = 0;
        while (res -- > 0)
        {
            // Print lexicographically
            // smallest order
            while (row[ri] == 1)
            {
                ri++;
            }
            while (col[ci] == 1)
            {
                ci++;
            }
            Console.WriteLine((ri + 1) + " " +
                              (ci + 1) + " ");
            ri++;
            ci++;
        }
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        // Size of board
        int N = 4;
 
        // Number of rooks already placed
        int K = 2;
 
        // Position of rooks
        int [, ]pos = {{1, 4}, {2, 2}};
 
        // Function call
        countRooks(N, K, pos);
    }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
    // Function to print the maximum rooks
    // and their positions
    function countRooks(n, k, pos)
    {
        let row = new Array(n).fill(0);
        let col = new Array(n).fill(0);
  
        // Initialize row and col array
        for (let i = 0; i < n; i++) {
            row[i] = 0;
            col[i] = 0;
        }
  
        // Marking the location of
        // already placed rooks
        for (let i = 0; i < k; i++) {
            row[pos[i][0] - 1] = 1;
            col[pos[i][1] - 1] = 1;
        }
  
        let res = n - k;
  
        // Print number of non-attacking
        // rooks that can be placed
        document.write(res + " " + "<br/>");
  
        // To store the placed rook
        // location
        let ri = 0, ci = 0;
        while (res-- > 0) {
  
            // Print lexicographically
            // smallest order
            while (row[ri] == 1) {
                ri++;
            }
            while (col[ci] == 1) {
                ci++;
            }
            document.write(
                (ri + 1)
                + " " + (ci + 1)
                + " " + "<br/>");
            ri++;
            ci++;
        }
    }
 
// Driver Code
 
     
        // Size of board
        let N = 4;
  
        // Number of rooks already placed
        let K = 2;
  
        // Position of rooks
        let pos = [[ 1, 4 ], [ 2, 2 ]];
  
        // Function call
        countRooks(N, K, pos);
                 
</script>
Producción: 

2 
3 1 
4 3

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

Publicación traducida automáticamente

Artículo escrito por Anmolbansal1 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 *