【每日一题】782. 变为棋盘


一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能交换任意两列或是两行的位置。

返回 将这个矩阵变为  “棋盘”  所需的最小移动次数 。如果不存在可行的变换,输出 -1

“棋盘” 是指任意一格的上下左右四个方向的值均与本身不同的矩阵。

 

 

复制代码
class Solution:
    def movesToChessboard(self, board: List[List[int]]) -> int:

        if not self.check(board):
            return -1
        col = []
        for i in range(len(board)):
            col.append(board[i][0])
        
        return int(self.getSwapCnt(board[0]) + self.getSwapCnt(col))

    def check(self,board):
        return self.checkFirstRow(board) and self.checkFirstCol(board) and self.checkRow(board) and self.checkCol(board)
    
    def checkFirstRow(self,board):
        rowOnecnt = 0
        rowZerocnt = 0
        first = board[0]
        for i in first:
            if i==0:
                rowOnecnt += 1
            else:
                rowZerocnt += 1
        return rowOnecnt==rowZerocnt or abs(rowOnecnt-rowZerocnt)==1
    
    def checkFirstCol(self,board):
        rowOnecnt = 0
        rowZerocnt = 0
        collen = len(board)
        for i in range(collen):
            a = board[i][0]
            if a==0:
                rowOnecnt += 1
            else:
                rowZerocnt += 1
        return rowOnecnt==rowZerocnt or abs(rowOnecnt-rowZerocnt)==1

    def checkRow(self,board):
        first = board[0]
        first_oppo = [1-i for i in first]
        sameCnt = 0
        oppositeCnt = 0
        for cut in board:
            if cut==first:
                sameCnt += 1
            elif cut==first_oppo:
                oppositeCnt += 1
            else:
                return False
        return sameCnt==oppositeCnt or abs(sameCnt-oppositeCnt)==1
    
    def checkCol(self,board):
        m = len(board)
        n = len(board[0])
        new_board = [[0 for i in range(m)] for j in range(n)]
        for i in range(len(board)):
            for j in range(len(board[i])):
                new_board[j][i] = board[i][j]
        return self.checkRow(new_board)

    def getSwapCnt(self,array1):
        prenum = 1
        errocnt = 0

        for i in array1:
            if i!=prenum:
                errocnt += 1
            prenum = 1-prenum
        
        if len(array1)%2 == 0:
            return min(len(array1)-errocnt,errocnt) / 2
        else:
            if errocnt%2==0:
                return errocnt/2
            else:
                return (len(array1)-errocnt) >> 1

    
复制代码

 

posted @   xiaoxinlong  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
AmazingCounters.com
点击右上角即可分享
微信分享提示