C++ 中的棋盘转换


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

因此,如果输入类似于 -

















则输出将为 2,因为在第一次移动中交换前两列,然后棋盘将类似于 -

















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

















这是棋盘

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

  • n := b 的大小
  • 初始化 i := 0,当 i < n 时,更新(i 加 1),执行 -
    • 初始化 j := 0,当 j < n 时,更新(j 加 1),执行 -
      • 如果 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 < n 时,更新(i 加 1),执行 -
    • rowSum := rowSum + b[i, 0], colSum := colSum + b[0, i]
    • 当 rowSwap + b[i, 0] 等于 i mod 2 时,rowSwap := true,
    • 当 colSwap + b[0, i] 等于 i mod 2 时,colSwap := 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 的最小值
  • 返回 (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

更新于: 2020年6月2日

433 次查看

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.