惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - fenix

IISExpress 开放局域网访问 sql窗口函数 Sql分页语句 常用SQL 数据库导出结构的sql WebAPI post 跨域调用及坑 单进程运行 MahApps.Metro样式 iis7 添加Mime Geometric paths,mini language Accessing WMF metadata with C# 标点符号 摘抄 temp C# deep copy 数独 简单对称加密 ICommand ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications
sudoku
fenix · 2013-05-27 · via 博客园 - fenix
import datetime
import copy
import random

__TIMES = 0

def crs(A,B):
    return [a+b for a in A for b in B]

_DTS = '123456789'
_RS = 'ABCDEFGHI'
_RU = ('ABC','DEF','GHI')
_CS = _DTS
_CU = ('123','456','789')
_SQS = crs(_RS,_CS)
_UL = [crs(_RS,c) for c in _CS]+[crs(r,_CS) for r in _RS] + [crs(r1,c1) for r1 in _RU for c1 in _CU]
_US = dict((s,[u for u in _UL if s in u]) for s in _SQS)
_PS = dict((s,set(sum(_US[s],[]))-set([s])) for s in _SQS)

def getValue(src):
    cs = [c for c in src if c in _DTS or c in '0. ']
    if(len(cs)!=81):
        print('Wrong Sudoku')
        return False
    valueso = dict(zip(_SQS,cs))
    values = dict((s,_DTS) for s in _SQS)
    for s,d in valueso.items():
        if(d in _DTS and not assignValue(values,s,d)):
            return False
    return values

def assignValue(values,s,d):
    valuesToElim = values[s].replace(d,'')
    if(all(elimValue(values,s,d) for d in valuesToElim)):
        return values
    else:
        return False

def elimValue(values,s,d):
    if(d not in values[s]):
        return values
    values[s] = values[s].replace(d,'')
    if(len(values[s])==0):
        return False
    elif(len(values[s])==1):
        d1 = values[s]
        if(not all(elimValue(values,s1,d1) for s1 in _PS[s])):
            return False
    for u in _US[s]:
        dp = [s2 for s2 in u if d in values[s2]]
        if(len(dp)==0):
            return False
        elif(len(dp)==1):
            if(not assignValue(values,dp[0],d)):
                return False
    return values

def getAnswer(seq):
    for e in seq:
        if(e):
            return e
    return False

def search(values):
    if(values is False):
        return False
    global __TIMES
    __TIMES += 1
    if(all(len(values[s])==1 for s in _SQS)):
        return values
    n,s = min((len(values[s]),s) for s in _SQS if len(values[s])>1)
    return getAnswer(search(assignValue(values.copy(),s,d)) for d in values[s])

def printSudoku(values):
    if(values is False):
        print 'Failed'
        return False
    line = '+'.join(['-' * 3 * 2] * 3)
    for r in _RS:
        print (''.join(values[r+c].center(2) + ('|' if c in '36' else '') for c in _CS))
        if(r in 'CF'):
            print line
    print

grid1 = '800000000003600000070090200050007000000045700000100030001000068008500010090000400'

printSudoku(search(getValue(grid1)))
print('search times:' + str(__TIMES))