C++でチェス盤に変換する
1つのNxNボードに0と1のみが含まれているとします。これで、各移動で、任意の2行または任意の2列を入れ替えることができます。ボードを「チェス盤」に変えるための最小移動回数を見つける必要があります。ソリューションが存在しない場合は、-1を返します。
したがって、入力が-
のような場合 | | | |
| | | |
| | | |
| | | |
最初の動きの最初の2列として、出力は2になり、ボードは-
のようになります。 | | | |
| | | |
| | | |
| | | |
次に、2行目と3行目を入れ替えます-
| | | |
| | | |
| | | |
| | | |
これはチェス盤です
これを解決するには、次の手順に従います-
- n:=bのサイズ
- iを初期化する場合:=0、i
- jを初期化する場合:=0、j
- b [0、0] XOR b [0、j] XOR b [i、0] XOR b [i、j]がゼロ以外の場合、-
- 戻り値-1
- jを初期化する場合:=0、j
- 戻り値-1
- 戻り値-1
- colSwap mod 2がゼロ以外の場合、-
- colSwap:=n --colSwap
- rowSwap mod 2がゼロ以外の場合、-
- rowSwap:=n --rowSwap
- colSwap:=colSwapとnの最小値-colSwap
- rowSwap:=rowSwapとnの最小値-rowSwap
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int movesToChessboard(vector<vector<int>>& b) { int n = b.size(); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(b[0][0] ^ b[0][j] ^ b[i][0] ^ b[i][j]) return -1; } } int rowSum = 0; int colSum = 0; int rowSwap = 0; int colSwap = 0; for(int i = 0; i < n; i++){ rowSum += b[i][0]; colSum += b[0][i]; rowSwap += b[i][0] == i % 2; colSwap += b[0][i] == i % 2; } if(rowSum != n/2 && rowSum != (n + 1)/2)return -1; if(colSum != n/2 && colSum != (n + 1)/2)return -1; if(n % 2 == 1){ if(colSwap % 2) colSwap = n - colSwap; if(rowSwap % 2) rowSwap = n - rowSwap; }else{ colSwap = min(colSwap, n - colSwap); rowSwap = min(rowSwap, n - rowSwap); } return (rowSwap + colSwap)/2; } }; main(){ Solution ob; vector<vector<int>> v = {{0,1,1,0},{0,1,1,0},{1,0,0,1},{1,0,0,1}}; cout << (ob.movesToChessboard(v)); }
入力
{{0,1,1,0},{0,1,1,0},{1,0,0,1},{1,0,0,1}};
出力
2
-
C++でN*Nチェス盤に配置できる最大のビショップ
チェス盤のサイズを示す入力Nが与えられます。ここでのタスクは、Nの任意の値について、2人のビショップが互いに攻撃できないようにNXNチェス盤に配置できるビショップの数を見つけることです。例を挙げて理解しましょう。 入力 − n =2 出力 − N * Nチェス盤に配置できる最大のビショップ− 2(上記のように) 説明 −上に示したように、矛盾しない位置は司教が配置されている場所だけです。せいぜい2X2チェス盤のビショップ。 入力 − n =5 出力 − N * Nチェス盤に配置できる最大ビショップ:8(上記のように) 以下のプログラムで使用されているアプローチは次のとおりで
-
C++のチェス盤でのナイト確率
NxNチェス盤が1つあるとすると、騎士はr番目の行とc番目の列から開始し、正確にK回移動しようとします。ここでは、行と列に0のインデックスが付けられているため、左上の正方形は(0、0)であり、右下の正方形は(N-1、N-1)です。 騎士はセルから8つの異なるセルに移動できます。これは、この図に示されています- 騎士が移動するたびに、8つの可能な移動の1つをランダムに選択します。騎士は、正確にK移動するか、チェス盤から離れるまで移動を続けます。騎士が動きを止めた後もボードに留まる確率を見つける必要があります。 したがって、入力が3、2、0、0のような場合、出力は0.0625になります