📌  相关文章
📜  计数棋盘中女王可以访问的位置,国王不可以访问的位置

📅  最后修改于: 2021-04-21 22:35:57             🧑  作者: Mango

给定两个整数NM表示棋盘的尺寸,两个整数XY表示国王的位置,即像元(X,Y) 。任务是查找如果国王替换了国王可以访问的女王可以访问的单元格数量。国王访问他所有相邻的牢房,女王可以对角,水平和垂直移动。

例子:

方法:想法是首先找到女王可以访问的职位总数。然后找到国王可以访问的职位总数。女王只能访问的单元数就是国王可以访问的单元数减去女王可以访问的单元数。请按照以下步骤解决问题:

  • QueenMoves初始化为0,然后计算Queen的总移动量,如下所示:
  • kingMoves初始化为0,并计算出King的移动,如下所示:
  • 打印以上步骤中计算出的女王和国王之间的绝对差作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
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


输出:
18



时间复杂度: O(1)
辅助空间: O(1)