<wbr id="juant"></wbr>
  • <wbr id="juant"></wbr>
    更多課程 選擇中心


    Python培訓

    400-111-8989

    Python求解數獨,Python求解數獨教程

    • 發布:Python培訓
    • 來源:Python練習題庫
    • 時間:2018-03-21 14:14

    《最強大腦》國際賽打開序幕,中國“醬油哥”胡宇軒戰勝日本數獨高手,為中國戰隊再加一分。12歲的數獨神童胡宇軒在2017年最強大腦國際賽上打敗了世界數獨第一人森西亨太,而廣為人知。下圖是兩人pk數獨比賽時候的場景。

    1)解數獨常用的就是深度優先搜索算法,請你使用python編程,求解任意難度的數獨。

    import time

    class point:

        def __init__(self, x, y):

            self.x = x

            self.y = y

            self.available = []

            self.value = 0

    def rowNum(p, sudoku):

        row = set(sudoku[p.y * 9:(p.y + 1) * 9])

        row.remove(0)

        return row  # set type

    def colNum(p, sudoku):

        col = []

        length = len(sudoku)

        for i in range(p.x, length, 9):

            col.append(sudoku[i])

        col = set(col)

        col.remove(0)

        return col  # set type

    def blockNum(p, sudoku):

        block_x = p.x // 3

        block_y = p.y // 3

        block = []

        start = block_y * 3 * 9 + block_x * 3

        for i in range(start, start + 3):

            block.append(sudoku[i])

        for i in range(start + 9, start + 9 + 3):

            block.append(sudoku[i])

        for i in range(start + 9 + 9, start + 9 + 9 + 3):

            block.append(sudoku[i])

        block = set(block)

        block.remove(0)

        return block  # set type

    def initPoint(sudoku):

        pointList = []

        length = len(sudoku)

        for i in range(length):

            if sudoku[i] == 0:

                p = point(i % 9, i // 9)

                for j in range(1, 10):

                    if j not in rowNum(p, sudoku) and j not in colNum(p, sudoku) and j not in blockNum(p, sudoku):

                        p.available.append(j)

                pointList.append(p)

        return pointList

    def tryInsert(p, sudoku):

        availNum = p.available

        for v in availNum:

            p.value = v

            if check(p, sudoku):

                sudoku[p.y * 9 + p.x] = p.value

                if len(pointList) <= 0:

                    t1 = time.time()

                    useTime = t1 - t0

                    showSudoku(sudoku)

                    print('\nuse Time: %f s' % (useTime))

                    exit()

                p2 = pointList.pop()

                tryInsert(p2, sudoku)

                sudoku[p2.y * 9 + p2.x] = 0

                sudoku[p.y * 9 + p.x] = 0

                p2.value = 0

                pointList.append(p2)

            else:

                pass

    def check(p, sudoku):

        if p.value == 0:

            print('not assign value to point p!!')

            return False

        if p.value not in rowNum(p, sudoku) and p.value not in colNum(p, sudoku) and p.value not in blockNum(p, sudoku):

            return True

        else:

            return False

    def showSudoku(sudoku):

        for j in range(9):

            for i in range(9):

                print('%d ' % (sudoku[j * 9 + i]), end='')

            print('')

    if __name__ == '__main__':

        t0 = time.time()

        sudoku = [

            8, 0, 0, 0, 0, 0, 0, 0, 0,

            0, 0, 3, 6, 0, 0, 0, 0, 0,

            0, 7, 0, 0, 9, 0, 2, 0, 0,

            0, 5, 0, 0, 0, 7, 0, 0, 0,

            0, 0, 0, 0, 4, 5, 7, 0, 0,

            0, 0, 0, 1, 0, 0, 0, 3, 0,

            0, 0, 1, 0, 0, 0, 0, 6, 8,

            0, 0, 8, 5, 0, 0, 0, 1, 0,

            0, 9, 0, 0, 0, 0, 4, 0, 0,

        ]

        pointList = initPoint(sudoku)

        showSudoku(sudoku)

        print('\n')

        p = pointList.pop()

        tryInsert(p, sudoku)

    2)中國“醬油哥”胡宇軒對戰日本數獨高手的第1輪題目:標準數獨三題(初級難度),如下圖所示,請你用你編寫的python程序,計算出下列數獨的正確結果和程序運行時間。

    3)中國“醬油哥”胡宇軒對戰日本數獨高手的第2輪題目:標準數獨兩題(中級難度),如下圖所示,請你用你編寫的python程序,計算出下列數獨的正確結果和程序運行時間。

    4)中國“醬油哥”胡宇軒對戰日本數獨高手的第3輪題目:標準數獨一題(高級難度),如下圖所示,請你用你編寫的python程序,計算出下列數獨的正確結果和程序運行時間。

    (5)英國《每日郵報》報道“芬蘭數學家因卡拉,花費3個月時間設計出了世界上迄今難度最大的數獨游戲,而且它只有一個答案。因卡拉說只有思考能力最快、頭腦最聰明的人才能破解這個游戲。”下圖就是那個最難數獨,請你用你編寫的python程序,計算出下列數獨的正確結果和程序運行時間。

    請自行調試程序運行結果吧。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:教你用python一秒搭建HTTP服務器
    下一篇:python工程師常用的開發工具,是這三個!

    2021年Python面試題及答案匯總詳解

    python數據分析,你需要這些工具

    Python培訓講解二叉樹的三種深度

    Python培訓:如何實現窮舉搜索?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    天天日天天射天天干天天伊|奇米电影|奇米网_奇米首页|奇米首页 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>