【每日一题】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 @ 2024-12-08 22:52  xiaoxinlong  阅读(19)  评论(0)    收藏  举报
AmazingCounters.com