C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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
  • rowSum:=0、colSum:=0、rowSwap:=0、colSwap:=0
  • iを初期化する場合:=0、i
  • rowSum:=rowSum + b [i、0]、colSum:=colSum + b [0、i]
  • rowSwap:=rowSwap + b [i、0]がimod2と同じ場合はtrue
  • colSwap:=colSwap + b [0、i]がimod2と同じ場合はtrue
  • rowSumがn/2に等しくなく、rowSumが(n + 1)/ 2に等しくない場合、-
    • 戻り値-1
  • colSumがn/2に等しくなく、colSumが(n + 1)/ 2に等しくない場合、-
    • 戻り値-1
  • n mod 2が1と同じ場合、-
    • colSwap mod 2がゼロ以外の場合、-
      • colSwap:=n --colSwap
    • rowSwap mod 2がゼロ以外の場合、-
      • rowSwap:=n --rowSwap
  • それ以外の場合
    • colSwap:=colSwapとnの最小値-colSwap
    • rowSwap:=rowSwapとnの最小値-rowSwap
  • return(rowSwap + colSwap)/ 2
  • 理解を深めるために、次の実装を見てみましょう-

    #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

    1. C++でN*Nチェス盤に配置できる最大のビショップ

      チェス盤のサイズを示す入力Nが与えられます。ここでのタスクは、Nの任意の値について、2人のビショップが互いに攻撃できないようにNXNチェス盤に配置できるビショップの数を見つけることです。例を挙げて理解しましょう。 入力 − n =2 出力 − N * Nチェス盤に配置できる最大のビショップ− 2(上記のように) 説明 −上に示したように、矛盾しない位置は司教が配置されている場所だけです。せいぜい2X2チェス盤のビショップ。 入力 − n =5 出力 − N * Nチェス盤に配置できる最大ビショップ:8(上記のように) 以下のプログラムで使用されているアプローチは次のとおりで

    2. C++のチェス盤でのナイト確率

      NxNチェス盤が1つあるとすると、騎士はr番目の行とc番目の列から開始し、正確にK回移動しようとします。ここでは、行と列に0のインデックスが付けられているため、左上の正方形は(0、0)であり、右下の正方形は(N-1、N-1)です。 騎士はセルから8つの異なるセルに移動できます。これは、この図に示されています- 騎士が移動するたびに、8つの可能な移動の1つをランダムに選択します。騎士は、正確にK移動するか、チェス盤から離れるまで移動を続けます。騎士が動きを止めた後もボードに留まる確率を見つける必要があります。 したがって、入力が3、2、0、0のような場合、出力は0.0625になります