ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode/变为棋盘

2022-08-23 08:32:10  阅读:122  来源: 互联网

标签:rowDiff int 个数 变为 board 第一列 棋盘 colDiff LeetCode


一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能任意交换两列或是两行的位置
返回将这个矩阵变为  “棋盘”  所需的最小移动次数 ,如果不存在可行的变换,输出 -1

1. 数学方法

移动使满足条件的题目,首先得判断棋盘是否满足条件
容易从棋盘得知,需要满足以下几个条件

  1. 棋盘只存在两种行(列),即矩阵秩为2
  2. 对应的两种行(列)每个元素相异,即两行(列)正交
  3. 对于任意一行(列),0和1的个数差不超过1

判断思路:将所有行和列与第一行、第一列比较,判断是否满足相同或相异
计算判断第一行和第一列0和1的个数差值即可(满足条件的话,其它相同或相异的也必然满足)

移动次数计算:假定一种顺序,计算不在位的个数,分奇偶进行处理即可

class Solution {
public:
    int movesToChessboard(vector<vector<int>>& board) {
        int n = board.size(), rowSum = 0, colSum = 0, rowDiff = 0, colDiff = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) 
            //对于任意行和列,要么和第一行(第一列)全同,要么全异
                if (board[0][0] ^ board[i][0] ^ board[0][j] ^ board[i][j]) return -1;
        }
        //判断行和列不在位的个数,同时求和用于判断是否符合要求(0和1个数相差不超过一)
        for (int i = 0; i < n; ++i) {//先假设正确顺序为(101010....)
            rowSum += board[0][i];
            colSum += board[i][0];
            rowDiff += (board[i][0] == i % 2);
            colDiff += (board[0][i] == i % 2);
        }
        //如果第一行1的个数少于一半或多于一半(奇偶)
        if (n / 2 > rowSum || rowSum > (n + 1) / 2) return -1;
        //如果第一列1的个数少于一半或多于一半(奇偶)
        if (n / 2 > colSum || colSum > (n + 1) / 2) return -1;
        
        if (n % 2) {//如果为奇数(01010->10101无法进行转化,只能转化为01010)
            if (rowDiff % 2) rowDiff = n - rowDiff;//不在位为奇数,转化为偶数
            if (colDiff % 2) colDiff = n - colDiff;//不在位为奇数,转化为偶数
        } else {//如果为偶数
            rowDiff = min(n - rowDiff, rowDiff);//计算第一行最小不在位
            colDiff = min(n - colDiff, colDiff);//计算第一列最小不在位
        }
        return (rowDiff + colDiff) / 2;//移动一次可以解决两个不在位
    }
};

标签:rowDiff,int,个数,变为,board,第一列,棋盘,colDiff,LeetCode
来源: https://www.cnblogs.com/929code/p/16614878.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有