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

国王可以采取有效行动。

方法

在这里,骑士的举动在国际象棋棋子中是不寻常的。它的移动方向是朝着一个正方形,该正方形在水平方向上相距两个正方形,在垂直方向上相差一个正方形,或者在垂直方向上相交两个正方形,水平方向相隔一个正方形。因此,完整的举动看起来像字母“ L”,且形状各异(8个可能的举动)。结果,应用成对的哈希映射来标记骑士可以移动的所有可能的坐标。如果已经看到国王无法移动到附近的8个坐标中的任何一个,即,如果该坐标被骑士的移动散列,则将其声明为“将死”。

示例

// C++ program for verifying if a king
//移动有效动作
//修改后的棋盘中有N晚
#include <bits/stdc++.h>
using namespace std;
bool checkCheckMate1(pair<int, int>a1[], int n1, int kx1, int ky1){
   //对散列以指示或标记坐标
   map<pair<int, int>, int> mpp1;
   //迭代给定的N个骑士
   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
      //骑士可以达到的
      //起始或初始位置
      mpp1[{ x, y }] = 1;
      //第一步
      mpp1[{ x - 2, y + 1 }] = 1;
      //第二步
      mpp1[{ x - 2, y - 1 }] = 1;
      //第三步
      mpp1[{ x + 1, y + 2 }] = 1;
      //第4步
      mpp1[{ x + 1, y - 2 }] = 1;
      //第5步
      mpp1[{ x - 1, y + 2 }] = 1;
      //第6步
      mpp1[{ x + 2, y + 1 }] = 1;
      //第7步
      mpp1[{ x + 2, y - 1 }] = 1;
      //第8步
      mpp1[{ x - 1, y - 2 }] = 1;
   }
   //迭代所有可能的8个坐标
   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) {
            //验证或检查是否可以移动
            if (!mpp1[{ nx, ny }]) {
               return true;
            }
         }
      }
   }
   //任何举动
   return false;
}
//驱动程式码
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 << "不是将死!";
   else
      cout << "是的,将死!";
   return 0;
}

输出结果

是的,将死!
猜你喜欢