数独

leetcode 36. 有效的数独

最后都变了- 提交于 2020-01-11 03:41:33
这道题一开始是想要采用哈希表的方式来做,但是对于哈希表还不是很熟系,对于python中的两层的for循环也没有很了解,还是欠缺了很多的地方 class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: row = [[x for x in y if x!='.'] for y in board] col = [[x for x in y if x!='.'] for y in zip(*board)] pal = [[board[i+m][j+n] for m in range(3) for n in range (3) if board[i+m][j+n]!='.'] for i in (0,3,6) for j in (0,3,6)] return all(len(set(x)) == len(x) for x in (*row, *col, *pal)) 前三行代码很好理解,就是对于行,列,9个方格中的数字进行插入 row:就是按行遍历,把除了' .'以外的数字放入到row中 col:中的zip处理的是元祖,也可以理解为按照列来处理,并且有一个* 是处理成list类型 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象

数独程序

梦想与她 提交于 2020-01-10 13:25:21
#include <stdio.h> #include <cstring> using namespace std; int vis[10][10][10] = {0}; int a[10][10]; int turn(int x) { if(x%3==0) return x-2; if(x%3==1) return x; return x - 1; } void update(int x, int y, int val) { for(int i = 1; i <= 9; i++) vis[x][i][val] = vis[i][y][val] = 1; x = turn(x); y = turn(y); for(int i = x; i <= x + 2; i++) for(int j = y; j <= y + 2; j++) vis[i][j][val] = 1; } int main() { while(1) { memset(vis, 0, sizeof(vis)); puts("game is on"); for(int i = 1; i <= 9; i++) for(int j = 1; j <= 9; j++) { scanf("%d", &a[i][j]); if(a[i][j]) update(i, j, a[i][j]); } while(1) { int

计蒜客 数独(DFS)

巧了我就是萌 提交于 2020-01-10 02:22:10
蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案? 标准数独是由一个给与了提示数字的 9*9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个3*3 宫都没有重复的数字出现。 输入格式 一个9×9的数独,数字之间用空格隔开。*表示需要填写的数字。 输出格式 输出一个9×9的数独,把出入中的*替换成需要填写的数字即可。 本题答案不唯一,符合要求的答案均正确 样例输入 * 2 6 * * * * * * * * * 5 * 2 * * 4 * * * 1 * * * * 7 * 3 * * 2 * 1 8 * * * * 3 * 9 * * * * 5 4 * 1 * * 7 * 5 * * * * 1 * * * 6 * * 9 * 7 * * * * * * * * * 7 5 * 样例输出 1 2 6 7 3 4 5 9 8 3 7 8 5 9 2 6 1 4 4 9 5 1 6 8 2 3 7 7 3 9 4 2 5 1 8 6 8 6 1 3 7 9 4 2 5 2 5 4 8 1 6 3 7 9 5 4 7 2 8 1 9 6 3 6 1 3 9 5 7 8 4 2 9 8 2 6 4 3 7 5 1

数独大作业

╄→гoц情女王★ 提交于 2020-01-10 02:20:17
软件工程基础——数独终局生成与求解(三) 三、项目设计与实现过程 4、性能的改进 三、项目设计与实现过程 4、性能的改进 首先是关于数独终局的生成, 其次是求解数独的方法, 来源: CSDN 作者: 道化の華 链接: https://blog.csdn.net/weixin_43938310/article/details/103916282

数独算法及源代码

末鹿安然 提交于 2020-01-06 01:08:07
朋友手机装有数独游戏,开会报告等无聊的场合常拿来玩玩,游戏的算法似乎并不难,想想我也能做出来。今早闲的蛋疼,就写了个数独玩玩。记录如下: 数独规则不知道的可以参考这里: http://baike.baidu.com/view/961.htm?fr=ala0_1 。游戏关键的算法就在于生成一个符合数独游戏规则的初始矩阵,首先想到的自然是号称万能解题法的“搜索 + 剪枝”了。 1. 产生符合数独规则的初始矩阵 第一行是随机生成的 1~9 的排列,第 2 到 9 行就要通过搜索来产生了。对于第 2 到 9 行的每一个空格,要从 1 到 9 逐个尝试放入,看同一列、同一行、同一个 3 × 3 的小方阵中是否出现过相同的数字,若没有就尝试放入,然后递归地搜索下一个位置的数字,若 1 到 9 都不行就返回上一个位置尝试下一个数字。直到找到一组解就返回。 先上 C++ 代码: #include < iostream > #include < algorithm > #include < ctime > using namespace std; int Initial_State [ 10 ] [ 10 ] ; bool get_Initial_State( int i , int j ) // 搜索第( i , j )位置处可以存储的数字,找到解则返回true,否则返回false { if (

数独问题求解一:任务

只谈情不闲聊 提交于 2019-12-27 09:57:55
数独问题求解一:任务 一、任务 二、要求 三、作业提交 四、需求 生成终局 求解数独 五、测试须知 项目地址: https://github.com/wzh994/wzh 一、任务 实现一个能够生成数独终局并且能求解数独问题的控制台程序。 二、要求 阅读个人软件开发流程(PSP)的相关资料。 可选的语言包括:C++, Java, Pythono运行环境为64bit Windows 10o 提交的代码要求经过代码质量分析工具的分析并消除所有的警告。如 Code Quality Analysis . 完成项目的首个版本之后,请使用性能分析工具来找出代码中的性能瓶颈并进行改进。 使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;并写出至少10 个测试用例确保你的程序能够正确处理各种情况。如 Studio Profiling TooISc 使用GitHub来管理源代码和测试用例, 代码有进展即签入GitHubo签入记录不合理的 项目会被抽查询问项目细节 。 按照要求发布博客,结合个人项目的实践经历,撰写解决项目的心路历程与收获。 博客 与GitHub项目明显不符的作业将取消作业成绩 。 注意:要求3、4、5根据所选编程语言使用对应的开发工具来完成。 . 三、作业提交 ・撰写一个博客,要求参见博客作业要求。 ・在个人博客上发布项目源代码(包含单元测试用例)的GitHub链接

数独

对着背影说爱祢 提交于 2019-12-21 23:36:01
思想:暴力,递归,DFS,回溯。填一个数字后检测是否满足条件,不满足就回溯。 # include <iostream> # include <time.h> using namespace std ; int S [ 9 ] [ 9 ] ; int Check ( int Sum ) { int row = Sum / 9 , col = Sum % 9 ; int row2 = row / 3 * 3 ; int col2 = col / 3 * 3 ; int i = 0 , j = 0 , m = 0 , n = 0 ; for ( i = 0 ; i < 9 ; i ++ ) //行检查 if ( S [ row ] [ i ] == S [ row ] [ col ] && col != i ) return 1 ; for ( j = 0 ; j < 9 ; j ++ ) //检查列 if ( S [ j ] [ col ] == S [ row ] [ col ] && row != j ) return 1 ; for ( m = row2 ; m < row2 + 3 ; m ++ ) //检查所在的九宫格 { for ( n = col2 ; n < col2 + 3 ; n ++ ) if ( S [ row ] [ col ] == S [ m ] [ n

数独终局生成和求解

别等时光非礼了梦想. 提交于 2019-12-20 23:52:19
软件工程基础个人大作业 数独终局生成和求解 github项目地址https://github.com/lukal-new/new-potato/tree/sudoku 一、预计开发 Personal Software Process Stages 预估耗时(分钟) 计划 60 估计任务所需时间 20 开发 1500 需求分析 30 生成设计文档 40 设计复审 40 代码规范 300 具体设计 300 具体代码 600 具体编码 600 代码复审 60 测试 300 报告 120 测试报告 120 计算工作量 30 事后总结并提出过程改进计划 120 合计 4240 二、解题思路描述 题目要求分为几个部分,完成代码开发、撰写博客、管理github项目三个大部分。 代码开发部分,首先仔细阅读个人项目要求,做好需求分析,并生成设计文档,然后进行设计复查,完善题目要求的功能和需求。从网上查询相关的算法和程序代码,明晰解题的思路和流程。然后开始进行设计代码,明确所需要用到的函数变量等和函数之间的关系,组织好代码流程。具体实现代码。然后进行功能测试,编写测试用例,对程序的功能进行测试。保证实现基本功能后,再改善所用到的数据结构,改善函数的组织形式和实现方法,以提升空间和运行速度等性能。 博客选择CSDN博客,从项目刚开始时进行博客记录,随着代码开发逐步完善博客。 建立github仓库

数独终盘生成的几种方法

北战南征 提交于 2019-12-04 19:10:27
数独(すうどく,Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 一般情况下,产生一个数独题目,包含两个步骤: 产生一个数独终盘(9X9) 在第一步产生的数独终盘中,根据难易程度,在终盘上挖掉不同数目的数字。 经过该两个步骤之后,我们就可以将某一个数独难题展示出来,如: 本文列举数独终盘产生的几个方法,大家一起来看看吧。 矩阵转换法 矩阵转换法,简言之,就是对一个已有的数独终盘矩阵进行操作。 主要采用 交换数字、交换行/列数据 等方法,产生新的矩阵。 为了完成矩阵的转换,我们需要有可用的数独终盘矩阵作为 种子矩阵 才行。可以采用如下做法完成: 先给定几个可用数独终盘作为备选种子矩阵。 产生一个随机数,随机选中其中的一个作为种子矩阵。 如编写一个产生种子矩阵的工具类: import java.util.Random; /** * * @author wangmengjun * */ public final class SeedSudokuMatrixFactory { private static final int seedSudokuArrays[][][] = { { { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 4, 5, 6,

回溯法解数独

巧了我就是萌 提交于 2019-12-03 16:36:44
数独 ,是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。 使1-9每个数字在每一行、每一列和每一宫中都只出现一次 ,所以又称“ 九宫格 ”。 目标 对于一个给定的“残缺”的9 X 9棋盘,使用 回溯法 去给出一个解, 如有解则打印出一个解 ; 如果没有解,则输出没有找到相应的解法 。 如: 给定一个“残缺”的棋盘, ----------------------- | 3 | 1 7 | 2 8 | | 5 | 2 | 9 4 | | 6 2 | 9 | 1 7 | ----------------------- | 3 | 4 1 | 6 | | 4 7 | | 3 5 | | 2 | 3 | 1 | ----------------------- | 1 | 7 9 | 2 | | 9 | 8 2 | 4 | | 8 | 3 | 7 | ----------------------- 得到如下的一个结果。 ----------------------- | 3 9 4 | 5 1 7 | 6 2 8 |