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>
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