数独填数 时间限制: 1000MS 内存限制: 65536KB 数独是源自18世纪瑞士的一种数学游戏。玩家需要根据9×9网格上的已知数字,将剩余的所有空格填上数字,使得9×9网格上每一行、每一列及每一个3×3方块(粗线)内的数字均包含1~9,并且数字不重复。 例1:下图(左)是未完成的数独,下图(右)是完成后的结果。 这个数独可以使用如下9×9的字符方阵表示(空格用“.”表示): 未完成 17.5..8.. .52.1.... .....759. .8...94.3 .197.4..8 7......15 4.1...6.. 3...2..59 ...96..3. 已完成 174593826 952816347 638247591 286159473 519734268 743682915 491375682 367428159 825961734 例2: 未完成 68.9.5... ..3...5.8 4.21.87.3 39.72.8.. .......1. .45..69.. .6.8.4..2 ..1..2.75 7...13... 已完成 687935241 913247568 452168793 396721854 278459316 145386927 569874132 831692475 724513689 例3: 未完成 835.2..41 .2.....39 .4.81.... .869..... 2.1..47.. 9.....286 ...356..7 .9..4.3.. 5....7.1. 已完成 835729641 127465839 649813572 查看答案

正确答案:回溯法:逐格找'.',试填'1'~'9',校验该数在该行、该列、所属3x3宫均未出现则填入并递归;失败回溯改填。核心校验:\ndef ok(r,c,v):\n return all(g[r][i]!=v and g[i][c]!=v for i in range(9)) and all(g[r//3*3+i][c//3*3+j]!=v for i in range(3) for j in range(3))\n填完后逐行print(''.join(row))
试卷来源:202305(第14届)蓝桥杯C++编程青少组(国赛)真题