{"id":693,"date":"2020-09-26T11:11:39","date_gmt":"2020-09-26T03:11:39","guid":{"rendered":"http:\/\/39.96.58.60\/?p=693"},"modified":"2022-10-18T16:38:16","modified_gmt":"2022-10-18T08:38:16","slug":"leetcode-37-%e8%a7%a3%e6%95%b0%e7%8b%ac","status":"publish","type":"post","link":"http:\/\/www.yatenglg.cn\/blog\/?p=693","title":{"rendered":"Leetcode 37. \u89e3\u6570\u72ec"},"content":{"rendered":"<p>\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u901a\u8fc7\u5df2\u586b\u5145\u7684\u7a7a\u683c\u6765\u89e3\u51b3\u6570\u72ec\u95ee\u9898\u3002<\/p>\n<p>\u4e00\u4e2a\u6570\u72ec\u7684\u89e3\u6cd5\u9700<strong>\u9075\u5faa\u5982\u4e0b\u89c4\u5219<\/strong>\uff1a<\/p>\n<ol>\n<li>\u6570\u5b57\u00a0<code>1-9<\/code>\u00a0\u5728\u6bcf\u4e00\u884c\u53ea\u80fd\u51fa\u73b0\u4e00\u6b21\u3002<\/li>\n<li>\u6570\u5b57\u00a0<code>1-9<\/code>\u00a0\u5728\u6bcf\u4e00\u5217\u53ea\u80fd\u51fa\u73b0\u4e00\u6b21\u3002<\/li>\n<li>\u6570\u5b57\u00a0<code>1-9<\/code>\u00a0\u5728\u6bcf\u4e00\u4e2a\u4ee5\u7c97\u5b9e\u7ebf\u5206\u9694\u7684\u00a0<code>3x3<\/code>\u00a0\u5bab\u5185\u53ea\u80fd\u51fa\u73b0\u4e00\u6b21\u3002<\/li>\n<\/ol>\n<p>\u7a7a\u767d\u683c\u7528\u00a0<code>'.'<\/code>\u00a0\u8868\u793a\u3002<\/p>\n<p><img src=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/ff\/Sudoku-by-L2G-20050714.svg\/250px-Sudoku-by-L2G-20050714.svg.png\" \/><\/p>\n<p><small>\u4e00\u4e2a\u6570\u72ec\u3002<\/small><\/p>\n<p><img src=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/31\/Sudoku-by-L2G-20050714_solution.svg\/250px-Sudoku-by-L2G-20050714_solution.svg.png\" \/><\/p>\n<p><small>\u7b54\u6848\u88ab\u6807\u6210\u7ea2\u8272\u3002<\/small><\/p>\n<p><strong>Note:<\/strong><\/p>\n<ul>\n<li>\u7ed9\u5b9a\u7684\u6570\u72ec\u5e8f\u5217\u53ea\u5305\u542b\u6570\u5b57\u00a0<code>1-9<\/code>\u00a0\u548c\u5b57\u7b26\u00a0<code>'.'<\/code>\u00a0\u3002<\/li>\n<li>\u4f60\u53ef\u4ee5\u5047\u8bbe\u7ed9\u5b9a\u7684\u6570\u72ec\u53ea\u6709\u552f\u4e00\u89e3\u3002<\/li>\n<li>\u7ed9\u5b9a\u6570\u72ec\u6c38\u8fdc\u662f\u00a0<code>9x9<\/code>\u00a0\u5f62\u5f0f\u7684\u3002<\/li>\n<\/ul>\n<p>**\u96be\u5ea6**: Hard<\/p>\n<p>**\u6807\u7b7e**: \u54c8\u5e0c\u8868\u3001 \u56de\u6eaf\u7b97\u6cd5\u3001<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-python\" data-lang=\"Python\"><code>\n# -*- coding: utf-8 -*-\n# @Author  : LG\n\n\"\"\"\n\u6267\u884c\u7528\u65f6\uff1a196 ms, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e8662.91% \u7684\u7528\u6237\n\u5185\u5b58\u6d88\u8017\uff1a13.5 MB, \u5728\u6240\u6709 Python3 \u63d0\u4ea4\u4e2d\u51fb\u8d25\u4e8698.31% \u7684\u7528\u6237\n\n\u89e3\u9898\u601d\u8def\uff1a\n    \u56de\u6eaf\n    \u5177\u4f53\u5b9e\u73b0\u89c1\u4ee3\u7801\u6ce8\u91ca\n\"\"\"\nclass Solution:\n    def solveSudoku(self, board: List[List[str]]) -&gt; None:\n        \"\"\"\n        Do not return anything, modify board in-place instead.\n        \"\"\"\n        w, h = len(board), len(board[0])    # \u6570\u72ec\u7684\u957f\u5bbd\uff0c \u5b9e\u9645\u4e0a \u90fd\u662f9\n        rows_record = [[] for _ in range(w)]    # \u7528\u6765\u8bb0\u5f55 \u6bcf\u4e00\u884c \u7528\u8fc7\u7684\u6570\u5b57     9\u884c\n        cols_record = [[] for _ in range(h)]    # \u7528\u6765\u8bb0\u5f55\u6bcf\u4e00\u5217\u7528\u8fc7\u7684\u6570\u5b57       9\u5217\n        blocks_record = [[] for _ in range(w)]  # \u7528\u6765\u8bb0\u5f55\u6bcf\u4e00\u4e2a\u65b9\u5757\u7528\u8fc7\u7684\u6570\u5b57    9\u4e2a\u65b9\u5757\n        unuse_coord = []                        # \u7528\u6765\u8bb0\u5f55\u9700\u8981\u586b\u5199\u7684\u7a7a\u7684\u5750\u6807\n        results = []                            # \u6700\u7ec8\u586b\u5199\u7ed3\u679c\uff0c\uff08r,c,num\uff09 \u884c\u3001\u5217\u3001\u6570\n\n        # \u8bfb\u53d6\u68cb\u76d8\u4fe1\u606f\uff0c\u586b\u5199\u4e0a\u8ff0\u8868\n        for i, nums in enumerate(board):\n            for j, num in enumerate(nums):\n                now = board[i][j]\n                if now == '.':\n                    unuse_coord.append((i, j))\n                else:\n                    rows_record[i].append(now)\n                    cols_record[j].append(now)\n                    blocks_record[j\/\/3 + i\/\/3*3].append(now)\n\n        def backtrack(i, used): # \u672a\u586b\u5199\u7a7a\u7684\u4e0b\u6807\uff0c\u586b\u5199\u8fc7\u7684\u4fe1\u606f\u5217\u8868\n\n            if i &gt;= len(unuse_coord):   # \u5982\u679c\u90fd\u586b\u5b8c\u4e86\uff0c\u5219\u5c06\u5f53\u524d\u586b\u5199\u65b9\u5f0f\u52a0\u5165\u5230\u6700\u7ec8\u7ed3\u679c\u4e2d\n                results.append(used.copy())\n                return\n            r, c  = unuse_coord[i]      # \u5f53\u524d\u586b\u5199\u7684\u7a7a\u7684\u5750\u6807\u3002 \u884c \u5217\n            for num in '123456789':     # \u7528\u6570\u5b57\u5faa\u73af\u53bb\u8bd5\u8fd9\u4e2a\u7a7a\n\n                if num not in rows_record[r] and num not in cols_record[c] and num not in blocks_record[c\/\/3 + r\/\/3*3]: # \u586b\u5199\u68c0\u67e5\n                    rows_record[r].append(num)  # \u5c06\u5f53\u524d\u6570\u5b57\u52a0\u5165\u5230 \u884c\u3001\u5217\u3001\u5757\u8bb0\u5f55\u4e2d\uff0c\u8868\u660e\u5df2\u4f7f\u7528\n                    cols_record[c].append(num)\n                    blocks_record[c\/\/3 + r\/\/3*3].append(num)\n                    used.append((r,c,num))  # \u5c06\u5f53\u524d\u6570\u5b57\u52a0\u5165\u586b\u5199\u4fe1\u606f\u4e2d\n                    backtrack(i+1, used)    # \u586b\u4e0b\u4e00\u4e2a\u7a7a\n\n                    # \u56de\u6eaf\n                    rows_record[r].pop()\n                    cols_record[c].pop()\n                    blocks_record[c \/\/ 3 + r \/\/ 3 * 3].pop()\n                    used.pop()\n\n        backtrack(0, [])\n\n        result = results[0] # \u8fd9\u91cc\u5199\u6cd5\u4f1a\u83b7\u5f97\u591a\u4e2a\u7b54\u6848\uff08\u5982\u679c\u5b58\u5728\u591a\u4e2a\u7b54\u6848\uff09\uff0c\u9898\u4e2d\u53ea\u8981\u6c42\u4e00\u4e2a\n\n        # \u5c06\u7b54\u6848\u5199\u5165\u68cb\u76d8\n        for coord in result:\n            r, c, num = coord\n            board[r][c] = num\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u901a\u8fc7\u5df2\u586b\u5145\u7684\u7a7a\u683c\u6765\u89e3\u51b3\u6570\u72ec\u95ee\u9898\u3002 \u4e00\u4e2a\u6570\u72ec\u7684\u89e3\u6cd5\u9700\u9075\u5faa\u5982\u4e0b\u89c4\u5219\uff1a \u6570\u5b57\u00a01-9\u00a0\u5728\u6bcf\u4e00\u884c\u53ea\u80fd\u51fa\u73b0&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":[],"categories":[11,1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/693"}],"collection":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=693"}],"version-history":[{"count":2,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/693\/revisions"}],"predecessor-version":[{"id":755,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/693\/revisions\/755"}],"wp:attachment":[{"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=693"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.yatenglg.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}