C++での騎士の可能な動き
この問題では、塗りつぶされた位置が1でマークされたm * nチェス盤が与えられます。つまり、board [i] [j] =1の場合、そこにいくつかの駒があり、与えられます。開始位置。私たちの仕事は、同じ色のピースがすべてある場合、つまり攻撃が行われない場合に、ボード内の騎士の可能な移動の総数を見つけることです。
Knight is chessは、特別な動きであらゆる方向に動くことができる作品です。チェスでのナイトの動きは-
-
2つの水平方向の動きと1つの垂直方向の動き。
-
2つの垂直方向の動きと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
-
C++での最小の騎士の動き
座標が-無限大から+無限大までの無限のチェス盤があり、正方形[0、0]に騎士がいるとします。騎士は、以下に示すように、8つの可能な動きをすることができます。それぞれの動きは、基本方向に2マス、次に直交方向に1マスです。 騎士を正方形[x、y]に移動するために必要な最小ステップ数を見つける必要があります。答えが存在することが保証されています。 したがって、入力がx=5およびy=5の場合、出力は4になります。これは[0,0]→[2,1]→[4,2]→[3,4]→[のようになります。 5,5] これを解決するには、次の手順に従います- マップを定義するm Solve()とい
-
C++で可能なすべての完全な二分木
完全な二分木が各ノードに正確に0または2つの子を持つ二分木であると仮定します。したがって、Nノードを持つすべての可能な完全な二分木のリストを見つける必要があります。回答内の各ツリーの各ノードは、node.val=0である必要があります。返されるツリーは任意の順序にすることができます。したがって、入力が7の場合、ツリーは- これを解決するには、次の手順に従います- 整数型のキーとツリー型の値のマップmを定義します。 allPossibleFBT()というメソッドを定義します。これは、入力としてNを取ります Nが1の場合、値が0のノードを1つ持つツリーを作成し、戻り値