Celdas máximas atacadas por Torre o Alfil en un tablero de ajedrez dado

Dados tres números enteros N, R y C que representan un tablero de ajedrez N*N y la posición (R, C) donde se colocan la torre y el alfil. La tarea es averiguar quién puede atacar la mayor cantidad de celdas (excepto la celda en la que se encuentran) y cuántas.

Nota: 

  • Una torre puede moverse solo horizontalmente a lo largo de la fila o verticalmente a lo largo de la columna y cualquier número de celdas a la vez.
  • Un alfil puede moverse en diagonal cualquier número de celdas a la vez.

Ejemplos :

Entrada : N = 3, R = 2, C = 1
Salida : Torre, 4
Explicación : La torre puede atacar 2 celdas en la fila y 2 celdas a lo largo de la columna. Entonces 2+2 = 4.
El obispo puede atacar solo 2 celdas (1, 2) y (3, 2).

Entrada : N=1, R=1, C=1
Salida : Ambos, 0

 

Enfoque : El problema se puede resolver mediante la siguiente observación:

Una torre puede moverse verticalmente hacia arriba o hacia abajo y horizontalmente hacia la izquierda o hacia la derecha. 
Así que el total de celdas atacadas por la torre = (N – 1) + (N – 1) = 2*(N – 1)

Un alfil puede atacar sólo en diagonal, es decir, a través de la diagonal principal o la diagonal secundaria.
Entonces, el número total de celdas atacadas a lo largo de la diagonal principal es min(R-1, C-1) + min(NR, NC) .
El número total de celdas atacadas a lo largo de la diagonal secundaria es min(R-1, NC) + min(NR, C-1)

Siga los pasos a continuación para resolver el problema:

  • Encuentre el total de celdas bajo el ataque de la torre (digamos X ) usando la fórmula anterior.
  • Encuentre el total de celdas bajo el ataque del alfil (digamos Y ) usando la fórmula anterior.
  • Compruebe cuál es mayor y devuelva la respuesta correspondiente.

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

C++

// C++ code to implement the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find No of cells Elephant
// and Camel can attack and return max of that
pair<int, int> fun(int n, int r, int c)
{
 
    // Edge Case
    if (n == 1)
        return make_pair(0, 0);
 
    // For Rook
    int row = n - 1, col = n - 1;
 
    // For Bishop
    int UL = min(r - 1, c - 1);
    int UR = min(r - 1, n - c);
    int DL = min(n - r, c - 1);
    int DR = min(n - r, n - c);
 
    // Count total moves of Rook
    int E = row + col;
 
    // Count total moves of Bishop
    int C = DL + DR + UL + UR;
 
    // Return maximum among two, consider
    // 0 for Rook, 1 for Bishop, -1 for both
    if (E == C)
        return { -1, E };
    if (E > C)
        return { 0, E };
    return { 1, C };
}
 
// Driver Code
int main()
{
    int N = 3, R = 2, C = 1;
 
    // Function call
    pair<int, int> p = fun(N, R, C);
 
    if (p.first == -1)
        cout << "Both, ";
    else if (p.first == 0)
        cout << "Rook, ";
    else
        cout << "Bishop, ";
    cout << p.second << endl;
    return 0;
}

Java

/*package whatever //do not write package name here */
 
import java.io.*;
 
class GFG {
  // Function to find No of cells Elephant
  // and Camel can attack and return max of that
  static int[] fun(int n, int r, int c)
  {
 
    int[] res = new int[2];
    // Edge Case
    if (n == 1){
      res[0] = 0;
      res[1] = 0;
      return res;
    }
 
    // For Rook
    int row = n - 1, col = n - 1;
 
    // For Bishop
    int UL = Math.min(r - 1, c - 1);
    int UR = Math.min(r - 1, n - c);
    int DL = Math.min(n - r, c - 1);
    int DR = Math.min(n - r, n - c);
 
    // Count total moves of Rook
    int E = row + col;
 
    // Count total moves of Bishop
    int C = DL + DR + UL + UR;
 
    // Return maximum among two, consider
    // 0 for Rook, 1 for Bishop, -1 for both
    if (E == C){
      res[0] = -1;
      res[1] = E;
    }
    else if (E > C){
      res[0] = 0;
      res[1] = E;
    }
    else{
      res[0] = 1;
      res[1] = C;
    }
    return res;
  }
 
  // Driver code
  public static void main(String args[])
  {
    int N = 3, R = 2, C = 1;
 
    // Function call
    int[] p = fun(N, R, C);
 
    if (p[0] == -1)
      System.out.print("Both, ");
    else if (p[0] == 0)
      System.out.print("Rook, ");
    else
      System.out.print("Bishop, ");
    System.out.println(p[1]);
  }
}
 
// This code is contributed by shinjanpatra

Python3

# Python program for the above approach
 
# Function to find No of cells Elephant
# and Camel can attack and return max of that
def fun(n, r, c):
 
    # Edge Case
    if (n == 1):
        return [0, 0];
 
    # For Rook
    row = n - 1
    col = n - 1
 
    # For Bishop
    UL = min(r - 1, c - 1);
    UR = min(r - 1, n - c);
    DL = min(n - r, c - 1);
    DR = min(n - r, n - c);
 
    # Count total moves of Rook
    E = row + col;
 
    # Count total moves of Bishop
    C = DL + DR + UL + UR;
 
    # Return maximum among two, consider
    # 0 for Rook, 1 for Bishop, -1 for both
    if (E == C):
        return [-1, E];
    if (E > C):
        return [0, E];
    return [1, C];
 
 
# Driver Code
 
N = 3
R = 2
C = 1
 
# Function call
p = fun(N, R, C);
 
if (p[0] == -1):
    print("Both, ", end="");
elif (p[0] == 0):
    print("Rook, ", end="");
else:
    print("Bishop, ", end="");
print(p[1]);
 
# This code is contributed by Saurabh Jaiswal

C#

// C# program for the above approach
using System;
 
public class GFG
{
   
  // Function to find No of cells Elephant
  // and Camel can attack and return max of that
  static int[] fun(int n, int r, int c)
  {
 
    int[] res = new int[2];
     
    // Edge Case
    if (n == 1){
      res[0] = 0;
      res[1] = 0;
      return res;
    }
 
    // For Rook
    int row = n - 1, col = n - 1;
 
    // For Bishop
    int UL = Math.Min(r - 1, c - 1);
    int UR = Math.Min(r - 1, n - c);
    int DL = Math.Min(n - r, c - 1);
    int DR = Math.Min(n - r, n - c);
 
    // Count total moves of Rook
    int E = row + col;
 
    // Count total moves of Bishop
    int C = DL + DR + UL + UR;
 
    // Return maximum among two, consider
    // 0 for Rook, 1 for Bishop, -1 for both
    if (E == C){
      res[0] = -1;
      res[1] = E;
    }
    else if (E > C){
      res[0] = 0;
      res[1] = E;
    }
    else{
      res[0] = 1;
      res[1] = C;
    }
    return res;
  }
 
  // Driver code
  public static void Main(String []args)
  {
    int N = 3, R = 2, C = 1;
 
    // Function call
    int[] p = fun(N, R, C);
 
    if (p[0] == -1)
      Console.Write("Both, ");
    else if (p[0] == 0)
      Console.Write("Rook, ");
    else
      Console.Write("Bishop, ");
       
    Console.WriteLine(p[1]);
  }
}
 
// This code is contributed by AnkThon

Javascript

<script>
       // JavaScript program for the above approach
 
       // Function to find No of cells Elephant
       // and Camel can attack and return max of that
       function fun(n, r, c) {
 
           // Edge Case
           if (n == 1)
               return [0, 0];
 
           // For Rook
           let row = n - 1, col = n - 1;
 
           // For Bishop
           let UL = Math.min(r - 1, c - 1);
           let UR = Math.min(r - 1, n - c);
           let DL = Math.min(n - r, c - 1);
           let DR = Math.min(n - r, n - c);
 
           // Count total moves of Rook
           let E = row + col;
 
           // Count total moves of Bishop
           let C = DL + DR + UL + UR;
 
           // Return maximum among two, consider
           // 0 for Rook, 1 for Bishop, -1 for both
           if (E == C)
               return [-1, E];
           if (E > C)
               return [0, E];
           return [1, C];
 
       }
       // Driver Code
 
       let N = 3, R = 2, C = 1;
 
       // Function call
       let p = fun(N, R, C);
 
       if (p[0] == -1)
           document.write("Both, ");
       else if (p[0] == 0)
           document.write("Rook, ");
       else
           document.write("Bishop, ");
       document.write(p[1] + '<br>');
 
   // This code is contributed by Potta Lokesh
 
   </script>
Producción

Rook, 4

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

Publicación traducida automáticamente

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