Cuente las posiciones en un tablero de ajedrez que puede visitar la Reina que no visita el Rey

Dados dos números enteros N y M que indican las dimensiones de un tablero de ajedrez, y dos números enteros X e Y que indican la posición del rey, es decir, la celda (X, Y) . La tarea es encontrar el número de celdas que la Reina puede visitar que no son visitadas por el Rey si es reemplazada por el Rey. El Rey visita todas sus celdas adyacentes y la Reina puede moverse en diagonal, horizontal y verticalmente.

Ejemplos:

Entrada: N = 8, M = 8, X = 1, Y = 1
Salida: 18
Explicación:
A continuación se muestra la imagen para mostrar el movimiento del Rey y la Reina: 

Suponga que K representa al Rey y * representa las celdas visitadas por el rey y Q representa a la Reina y # representa las celdas visitadas por la reina.
Entonces, el total de cuadrados que puede visitar la reina es 18.

Entrada: N = 2, M = 1, X = 1, Y = 1
Salida: 0

Enfoque: La idea es encontrar primero el número total de posiciones que la Reina puede visitar. Luego encuentra el número total de posiciones que el Rey puede visitar. El número de celdas que solo puede visitar la Reina será el número de celdas que el Rey puede visitar restado del número de celdas que la Reina puede visitar. Siga los pasos a continuación para resolver el problema:

  • Inicialice queenMoves por 0 y calcule los movimientos totales de la Reina de la siguiente manera:

Si N – X > 0 y M – Y > 0, JugadasReina = JugadasReina + min(N – X, M – Y) 
Si X – 1 > 0 y Y – 1 > 0, JugadasReina = JugadasReina + min(Y – 1, X – 1) 
Si X – 1 > 0 y M – Y > 0, JugadasReina = JugadasReina + min(X – 1, M – Y) 
Si N – X > 0 y Y – 1 > 0, JugadasReina = JugadasReina + min( N – X, Y – 1) 
Por último, agregue la respuesta para los movimientos horizontales y verticales como QueenMoves = QueenMoves + (N – 1) + (M – 1)

  • Inicialice kingMoves como 0 y calcule los movimientos de King de la siguiente manera:

Si X + 1 <= N, JugadasRey = JugadasRey + 1
Si X – 1 > 0, JugadasRey = JugadasRey + 1
Si Y + 1 <= M, JugadasRey = JugadasRey + 1
Si Y – 1 > 0, JugadasRey = JugadasRey + 1
Si X + 1 <= N e Y + 1 <= M, JugadasRey = JugadasRey + 1
Si X + 1 <= N e Y – 1 > 0, JugadasRey = JugadasRey + 1
Si X – 1 > 0 e Y – 1 > 0, JugadasRey = JugadasRey + 1
Si X – 1 > 0 y Y + 1 <= M, JugadasRey = JugadasRey + 1

  • Imprime como resultado la diferencia absoluta entre la reina y el rey calculada en los pasos anteriores.

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

C++

// C++ program for the above approach
#include <iostream>
using namespace std;
 
// Function to print the number of cells
// only visited by the queen
int Moves_Calculator(int x, int y,
                     int row, int col)
{
     
    // Find all the moves
    int total_moves = 0;
     
    // Find all moves for x + 1, y + 1
    if ((row - x) > 0 && (col - y) > 0)
        total_moves += min((row - x),
                           (col - y));
 
    // Find all moves for x - 1, y - 1
    if ((y - 1) > 0 && (x - 1) > 0)
        total_moves += min((y - 1),
                           (x - 1));
 
    // Find all moves for x - 1, y + 1
    if ((x - 1) > 0 && (col - y) > 0)
        total_moves += min((x - 1),
                         (col - y));
 
    // Find all moves for x + 1, y - 1
    if ((row - x) > 0 && (y - 1) > 0)
        total_moves += min((row - x),
                             (y - 1));
 
    total_moves += (row - 1) + (col - 1);
 
    // Find all squares visited by King
    // x + 1, in same row
    int king_moves = 0;
     
    if (x + 1 <= row)
        king_moves += 1;
 
    // x - 1, in same row
    if (x - 1 > 0)
        king_moves += 1;
 
    // y + 1, in same column
    if (y + 1 <= col)
        king_moves += 1;
 
    // y - 1, in same column
    if (y - 1 > 0)
        king_moves += 1;
 
    if (x + 1 <= row && y + 1 <= col)
        king_moves += 1;
 
    if (x + 1 <= row && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y + 1 <= col)
        king_moves += 1;
 
    // Return answer
    return total_moves - king_moves;
}
 
// Driver Code
int main()
{
     
    // Dimension of Board
    int n = 8, m = 8;
     
    // Position of Cell
    int x = 1, y = 1;
     
    // Function Call
    cout << (Moves_Calculator(x, y, m, n));
    return 0;
}
 
// This code is contributed by akhilsaini

Java

// Java program for the above approach
import java.io.*;
 
class GFG{
 
// Function to print the number of cells
// only visited by the queen
static int Moves_Calculator(int x, int y,
                            int row, int col)
{
     
    // Find all the moves
    int total_moves = 0;
 
    // Find all moves for x + 1, y + 1
    if ((row - x) > 0 && (col - y) > 0)
        total_moves += Math.min((row - x),
                                (col - y));
 
    // Find all moves for x - 1, y - 1
    if ((y - 1) > 0 && (x - 1) > 0)
        total_moves += Math.min((y - 1),
                                (x - 1));
 
    // Find all moves for x - 1, y + 1
    if ((x - 1) > 0 && (col - y) > 0)
        total_moves += Math.min((x - 1),
                              (col - y));
 
    // Find all moves for x + 1, y - 1
    if ((row - x) > 0 && (y - 1) > 0)
        total_moves += Math.min((row - x),
                                  (y - 1));
 
    total_moves += (row - 1) + (col - 1);
 
    // Find all squares visited by King
    // x + 1, in same row
    int king_moves = 0;
    if (x + 1 <= row)
        king_moves += 1;
 
    // x - 1, in same row
    if (x - 1 > 0)
        king_moves += 1;
 
    // y + 1, in same column
    if (y + 1 <= col)
        king_moves += 1;
 
    // y - 1, in same column
    if (y - 1 > 0)
        king_moves += 1;
 
    if (x + 1 <= row && y + 1 <= col)
        king_moves += 1;
 
    if (x + 1 <= row && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y + 1 <= col)
        king_moves += 1;
 
    // Return answer
    return total_moves - king_moves;
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Dimension of Board
    int n = 8, m = 8;
 
    // Position of Cell
    int x = 1, y = 1;
 
    // Function Call
    System.out.println(Moves_Calculator(x, y, m, n));
}
}
 
// This code is contributed by akhilsaini

Python3

# Python3 program for the above approach
 
# Function to print the number of cells
# only visited by the queen
def Moves_Calculator(x, y, row, col):
 
    # Find all the moves
    total_moves = 0
     
    # Find all moves for x + 1, y + 1
    if (row - x) > 0 and (col - y) > 0:
        total_moves += min((row - x), (col - y))
 
    # Find all moves for x - 1, y - 1
    if (y - 1) > 0 and (x - 1) > 0:
        total_moves += min((y - 1), (x - 1))
 
    # Find all moves for x - 1, y + 1
    if (x - 1) > 0 and (col - y) > 0:
        total_moves += min((x - 1), (col - y))
 
    # Find all moves for x + 1, y - 1
    if (row - x) > 0 and (y - 1) > 0:
        total_moves += min((row - x), (y - 1))
 
    total_moves += (row - 1) + (col - 1)
 
    # Find all squares visited by King
    # x + 1, in same row
    king_moves = 0
    if x + 1 <= m:
        king_moves += 1
 
    # x - 1, in same row
    if x - 1 > 0:
        king_moves += 1
 
    # y + 1, in same column
    if y + 1 <= n:
        king_moves += 1
 
    # y - 1, in same column
    if y - 1 > 0:
        king_moves += 1
 
    if x + 1 <= m and y + 1 <= n:
        king_moves += 1
 
    if x + 1 <= m and y - 1 > 0:
        king_moves += 1
 
    if x - 1 > 0 and y - 1 > 0:
        king_moves += 1
 
    if x - 1 > 0 and y + 1 <= n:
        king_moves += 1
 
    # Return answer
    return total_moves - king_moves
 
 
# Driver Code
if __name__ == '__main__':
 
    # Dimension of Board
    n, m = 8, 8
     
    # Position of Cell
    x, y = 1, 1
     
    # Function Call
    print(Moves_Calculator(x, y, m, n))

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to print the number of cells
// only visited by the queen
static int Moves_Calculator(int x, int y,
                            int row, int col)
{
     
    // Find all the moves
    int total_moves = 0;
 
    // Find all moves for x + 1, y + 1
    if ((row - x) > 0 && (col - y) > 0)
        total_moves += Math.Min((row - x),
                                (col - y));
 
    // Find all moves for x - 1, y - 1
    if ((y - 1) > 0 && (x - 1) > 0)
        total_moves += Math.Min((y - 1),
                                (x - 1));
 
    // Find all moves for x - 1, y + 1
    if ((x - 1) > 0 && (col - y) > 0)
        total_moves += Math.Min((x - 1),
                              (col - y));
 
    // Find all moves for x + 1, y - 1
    if ((row - x) > 0 && (y - 1) > 0)
        total_moves += Math.Min((row - x),
                                  (y - 1));
 
    total_moves += (row - 1) + (col - 1);
 
    // Find all squares visited by King
    // x + 1, in same row
    int king_moves = 0;
    if (x + 1 <= row)
        king_moves += 1;
 
    // x - 1, in same row
    if (x - 1 > 0)
        king_moves += 1;
 
    // y + 1, in same column
    if (y + 1 <= col)
        king_moves += 1;
 
    // y - 1, in same column
    if (y - 1 > 0)
        king_moves += 1;
 
    if (x + 1 <= row && y + 1 <= col)
        king_moves += 1;
 
    if (x + 1 <= row && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y - 1 > 0)
        king_moves += 1;
 
    if (x - 1 > 0 && y + 1 <= col)
        king_moves += 1;
 
    // Return answer
    return total_moves - king_moves;
}
 
// Driver Code
public static void Main()
{
 
    // Dimension of Board
    int n = 8, m = 8;
 
    // Position of Cell
    int x = 1, y = 1;
 
    // Function Call
    Console.WriteLine(Moves_Calculator(x, y, m, n));
}
}
 
// This code is contributed by akhilsaini

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to print the number of cells
// only visited by the queen
function Moves_Calculator(x, y, row, col)
{
      
    // Find all the moves
    let total_moves = 0;
  
    // Find all moves for x + 1, y + 1
    if ((row - x) > 0 && (col - y) > 0)
        total_moves += Math.min((row - x),
                                (col - y));
  
    // Find all moves for x - 1, y - 1
    if ((y - 1) > 0 && (x - 1) > 0)
        total_moves += Math.min((y - 1),
                                (x - 1));
  
    // Find all moves for x - 1, y + 1
    if ((x - 1) > 0 && (col - y) > 0)
        total_moves += Math.min((x - 1),
                              (col - y));
  
    // Find all moves for x + 1, y - 1
    if ((row - x) > 0 && (y - 1) > 0)
        total_moves += Math.min((row - x),
                                  (y - 1));
  
    total_moves += (row - 1) + (col - 1);
  
    // Find all squares visited by King
    // x + 1, in same row
    let king_moves = 0;
    if (x + 1 <= row)
        king_moves += 1;
  
    // x - 1, in same row
    if (x - 1 > 0)
        king_moves += 1;
  
    // y + 1, in same column
    if (y + 1 <= col)
        king_moves += 1;
  
    // y - 1, in same column
    if (y - 1 > 0)
        king_moves += 1;
  
    if (x + 1 <= row && y + 1 <= col)
        king_moves += 1;
  
    if (x + 1 <= row && y - 1 > 0)
        king_moves += 1;
  
    if (x - 1 > 0 && y - 1 > 0)
        king_moves += 1;
  
    if (x - 1 > 0 && y + 1 <= col)
        king_moves += 1;
  
    // Return answer
    return total_moves - king_moves;
}
 
// Driver code
 
// Dimension of Board
let n = 8, m = 8;
 
// Position of Cell
let x = 1, y = 1;
 
// Function Call
document.write(Moves_Calculator(x, y, m, n));
 
// This code is contributed by splevel62  
 
</script>
Producción: 

18

 

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

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