代码随想录Day23|回溯3|二维数组回溯

51.N皇后

  • 思路想清楚后还是能写出来代码
  • 测试错误的原因是以为只要相邻行的45度和135度上不存在皇后就可以了,但其实每行45度和135度上都不能存在皇后
class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def isValid(paths,idx,n):
            m = len(paths)
            for i in range(m):
                if paths[i][idx]=='Q':
                    return False
            ## 开始的错误思路
            # if paths[-1][idx]=='Q' or idx-1>=0 and paths[-1][idx-1]=='Q' or idx+1<len(paths[0]) and paths[-1][idx+1]=='Q':
            #     return False
            i,j = idx-1, m-1
            while(i>=0 and j>=0):
                if paths[j][i] =='Q':
                    return False
                i -= 1
                j -= 1
            
            i,j = idx+1, m-1
            while(i<n and j>=0):
                if paths[j][i] =='Q':
                    return False
                i += 1
                j -= 1
            
            return True

        def backtrace(paths,ans,n):
            if len(paths)==n:
                ans.append(paths)
            
            for i in range(n):
                if paths and not isValid(paths,i,n):
                    continue
                string = '.'*i+'Q'+'.'*(n-1-i)
                backtrace(paths+[string],ans,n)
        
        ans = []
        backtrace([],ans,n)
        return ans

37. 解数独

  • 比N皇后还要多一个维度,因为每个坑都可以填9个数
  • 写了半天没看出来哪里错了。。。明天继续
class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def isValid(board,row,col,temp):
            for i in range(9):
                if board[i][col]==temp:
                    return False
            for i in range(9):
                if board[row][i]==temp:
                    return False
            rowb = (row//3)*3
            colb = (col//3)*3
            for i in range(rowb,rowb+3):
                for j in range(colb,colb+3):
                    if board[i][j]==temp:
                        return False
            return True

        def backtrace(board):
            for i in range(9):
                for j in range(9):
                    if board[i][j]=='.':
                        for k in range(1,10):
                            if not isValid(board,i,j,str(k)):
                                continue
                            board[i][j] = str(k)
                            if backtrace(board): return True
                            board[i][j] = '.'
                        return False
        backtrace(board)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值