C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++で変更されたチェス盤にN泊しているときに、王が有効な動きを移動できるかどうかを確認します


コンセプト

チェスと同じルールで与えられた無限のチェス盤と、無限のチェス盤上の与えられたN人の騎士の座標(-10 ^ 9 <=x、y <=10 ^ 9)と王の座標に関して、タスクは次のことを確認することです。王はチェックメイトかどうか。

入力

a1[] = { { 2, 1 }, { 1, 3 }, { 3, 6 },{ 5, 5 }, { 6, 1 }, { 7, 3 }} king -> {4, 3}

出力

Yes

王はチェックメイトであるため、行動を起こすことができません。

入力

a1 [] = {{1, 1}} king -> {3, 4}

出力

No

王は有効な動きをすることができます。

メソッド

ここでは、騎士の動きはチェスの駒の中で珍しいものです。その動きは、水平方向に2マス、垂直方向に1マス、または縦に2マス、横に1マス離れたマスに向かっています。したがって、完全な動きは、可能なすべての形状で文字「L」のように見えます(8つの可能な動き)。この結果として、ペアのハッシュマップを適用して、騎士が移動できるすべての可能な座標をマークします。キングが近くの8つの座標のいずれにも移動できないことがわかっている場合、つまり、座標が騎士の移動によってハッシュされている場合、それは「チェックメイト」として宣言されます。

// C++ program for verifying if a king
// can move a valid move or not when
// N nights are there in a modified chessboard
#include <bits/stdc++.h>
using namespace std;
bool checkCheckMate1(pair<int, int>a1[], int n1, int kx1, int ky1){
   // Pair of hash to indicate or mark the coordinates
   map<pair<int, int>, int> mpp1;
   // iterate for Given N knights
   for (int i = 0; i < n1; i++) {
      int x = a1[i].first;
      int y = a1[i].second;
      // indicate or mark all the "L" shaped coordinates
      // that can be reached by a Knight
      // starting or initial position
      mpp1[{ x, y }] = 1;
      // 1-st move
      mpp1[{ x - 2, y + 1 }] = 1;
      // 2-nd move
      mpp1[{ x - 2, y - 1 }] = 1;
      // 3-rd move
      mpp1[{ x + 1, y + 2 }] = 1;
      // 4-th move
      mpp1[{ x + 1, y - 2 }] = 1;
      // 5-th move
      mpp1[{ x - 1, y + 2 }] = 1;
      // 6-th move
      mpp1[{ x + 2, y + 1 }] = 1;
      // 7-th move
      mpp1[{ x + 2, y - 1 }] = 1;
      // 8-th move
      mpp1[{ x - 1, y - 2 }] = 1;
   }
   // iterate for all possible 8 coordinates
   for (int i = -1; i < 2; i++) {
      for (int j = -1; j < 2; j++) {
         int nx = kx1 + i;
         int ny = ky1 + j;
         if (i != 0 && j != 0) {
            // verify or check a move can be made or not
            if (!mpp1[{ nx, ny }]) {
               return true;
            }
         }
      }
   }
   // any moves
   return false;
}
// Driver Code
int main(){
   pair<int, int&lgt; a1[] = { { 2, 1 }, { 1, 3 }, { 3, 6 }, { 5, 5 }, { 6, 1 }, { 7, 3 }};
   int n1 = sizeof(a1) / sizeof(a1[0]);
   int x = 4, y = 3;
   if (checkCheckMate1(a1, n1, x, y))
      cout << "Not Checkmate!";
   else
      cout << "Yes its checkmate!";
   return 0;
}

出力

Yes its checkmate!

  1. サイズnの指定された配列がnレベルのBSTを表すことができるかどうかをC++で確認してください

    配列Aがあり、配列がnレベルのBSTを表すことができるかどうかを確認する必要があります。レベルがであるため、次のようにツリーを構築できます。数値をkとすると、kより大きい値は右側に移動し、kより小さい値は左側に移動します。 {50、20、9、25、10}と{50、30、20、25、10}の2つのリストがあるとします。 最初のものは無効ですが、2番目のものは有効です。 これを確認するには、BSTを作成して高さを確認するか、配列ベースのアプローチを使用します。アレイベースのアプローチは以下のようなものです- 2つの変数max=infinityを使用して、左側のサブツリーの最大制限をマー

  2. Pythonで変更されたチェス盤にN泊しているときに、王が有効な動きを移動できるかどうかを確認します

    チェスと同じルールの無限チェス盤が1つあり、無限チェス盤にN騎士の座標と王の座標がある場合、王がチェックメイトであるかどうかを確認する必要があります。無限ボードの座標は、(-10 ^ 9 <=x、y <=10 ^ 9)のような大きな値で囲まれています。 したがって、入力が騎士の位置=[[2,1]、[1,3]、[3,6]、[5,5]、[6,1]、[7,3]]および王の位置のような場合:[4,3]、 キングには動きがないため、出力はTrueになり、チェックメイトになります。 これを解決するには、次の手順に従います- my_dict:=新しい地図 0からnの範囲のiについては、