C++ 中骑士的可能走法


在这个问题中,我们给定一个 m*n 的棋盘,其中填充的位置用 1 表示,即如果 board[i][j] = 1,则该位置有棋子,并且给定起始位置。我们的任务是在棋盘上找到骑士的所有可能走法总数,如果所有棋子都是同一种颜色,即不会发生攻击。

国际象棋中的骑士是一种可以向所有方向移动的棋子,并且具有特殊的移动方式。

  • 横向移动两格,纵向移动一格。

  • 纵向移动两格,横向移动一格。

让我们举个例子来理解这个问题:

**输入** -

board[][] = {
   { 0, 1, 0, 0 },
   { 0, 0, 1, 1 },
   { 0, 1, 1, 0 },
   { 0, 0, 0, 1 }
};
Position : (1,1)

**输出** - 4

为了解决这个问题,我们需要找到在棋盘上骑士所有可能走法中哪些是有效的走法。如果移动到棋盘上的一个位置,并且该位置没有被其他棋子占用,则该移动是有效的。

为此,我们将存储从给定位置开始骑士的所有可能走法。然后检查每种走法的有效性,并为每种有效走法增加计数。

示例

展示我们解决方案实现的程序 -

 在线演示

#include <bits/stdc++.h>
#define N 8
#define M 8
using namespace std;
int countPossibleMoves(int mat[N][M], int p, int q){
   int Xmoves[8] = { 2, 1, -1, -2, -2, -1, 1, 2 };
   int Ymoves[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
   int count = 0;
   for (int i = 0; i < 8; i++) {
      int x = p + Xmoves[i];
      int y = q + Ymoves[i];
      if (x>=0 && y>=0 && x<N && y<M && mat[x][y]==0)
         count++;
   }
   return count;
}
int main(){
   int mat[N][M] = { { 0, 1, 0, 0 },
      { 0, 0, 1, 1 },
      { 0, 1, 1, 0 },
      { 0, 0, 0, 1 }};
   int position[2] = {1,1};
   cout<<"Total number of moves possible for Knight from position ("<<position[0]<<" , "<<position[1]<<") are : ";
   cout<<countPossibleMoves(mat, position[0], position[1]);
   return 0;
}

输出

Total number of moves possible for Knight from position (1 , 1) are : 4

更新于: 2020-04-17

886 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告