ISCC_很普通的数独

题目描述:没那么简单~就能做出~数独的答案~尤其是在~看过这么多的题目
题目:链接

这个题目还是很有意思的,最开始跟抠脚凡两个人在那涂了半天的数字Orz,后来还是凡的小伙伴给出了脚本,自己写不出来就分析下别人的吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import pytesseract
from PIL import Image, ImageDraw #调用python的两个图像处理库
def get_qr_list():
qr_list = list() #初始化一个列表
for a in range(5 * 9): # 在一个列表中再构建5*9个列表
qr_list.append(list())
for b in range(5 * 9): # 对应列表补0
qr_list[a].append(0)
for e in range(5):
for f in range(5):
fname = '%s.png' % (e * 5 + f + 1)
img = Image.open(fname).convert('L') #打开目标文件 L表示八位像素 黑白
sx, sy, ex, ey, tx = 0, 0, 0, 0, 2
for x in range(9): #九行
ty = 2
tx += 1
sx = x * 22 + tx + 1
for y in range(9): #九列
ty += 1
sy = y * 21 + ty + 1
ex, ey = sx + 20, sy + 19
img_temp = img.crop((sx, sy, ex, ey)) #对图像进行剪切
code = pytesseract.image_to_string(img_temp, config="-psm 5") #获取剪切后图像的数字
if code!='':
qr_list[f * 9 + x][e * 9 + y] = 1 #有数字则将对应的qr_list赋值为1
print(qr_list[f * 9 + x][e * 9 + y], (x, y), (sx, sy, ex, ey), (e, f, x, y))
return qr_list
def get_qr_image(qr_list):
img = Image.new('L', (10 * 47, 10 * 47), (255)) #创建一个图像
draw = ImageDraw.Draw(img)
for e in range(5 * 9):
for f in range(5 * 9):
if qr_list[f][e]: #如果qr_list[f][e]为1
draw.rectangle(((e + 1) * 10, (f + 1) * 10, (e + 2) * 10, (f + 2) * 10 ), fill=(0)) #将对应区块涂黑
print(qr_list[f][e], ' ', end='')
print()
img.save('flag.png') #保存图片
if __name__ == '__main__':
get_qr_image(get_qr_list())

Python的图像处理库还是很强大的