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になります