转换为C ++中的Chessboard

假设我们有一个N x N板,仅包含0和1。现在,在每一步中,我们都可以交换任意2行或任意2列。我们必须找到将棋盘转变为“棋盘”的最小移动次数。如果解决方案不存在,则返回-1。

所以如果输入像-

















然后输出将为2,作为第一步中的前两列,然后板将像-

















然后交换第二行和第三行-

















这是棋盘

为了解决这个问题,我们将遵循以下步骤-

  • n:= b的大小

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 如果b [0,0] XOR b [0,j] XOR b [i,0] XOR b [i,j]为非零,则-

    • 返回-1

    • 对于初始化j:= 0,当j <n时,更新(将j增加1),执行-

    • rowSum:= 0,colSum:= 0,rowSwap:= 0,colSwap:= 0

    • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

      • rowSum:= rowSum + b [i,0],colSum:= colSum + b [0,i]

      • 当rowSwap + b [i,0]与我的mod 2相同时,rowSwap:= true

      • colSwap:=当colSwap + b [0,i]与我的mod 2相同时为true

    • 如果rowSum不等于n / 2并且rowSum不等于(n + 1)/ 2,则-

      • 返回-1

    • 如果colSum不等于n / 2并且colSum不等于(n + 1)/ 2,则-

      • 返回-1

    • 如果n mod 2与1相同,则-

      • rowSwap:= n-rowSwap

      • colSwap:= n-colSwap

      • 如果colSwap mod 2不为零,则-

      • 如果rowSwap mod 2不为零,则-

      • 除此以外

        • colSwap:= colSwap和n的最小值-colSwap

        • rowSwap:= rowSwap和n的最小值-rowSwap

      • 返回(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