数独

2020软件工程作业03

余生长醉 提交于 2020-03-29 18:45:33
这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 这个作业的要求在那里 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 这个作业的目标 数独 作业正文 如下 其他参考文献 百度、博客、同学2 Github地址 1.GitHub地址 https://github.com/Haa123-oss/-20177612/new/master 2.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 45 Estimate 估计这个任务需要多少时间 60 120 Development 开发 90 200 Analysis 需求分析 (包括学习新技术) 90 120 Design Spec 生成设计文档 30 50 Design Review 设计复审 10 20 Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 35 Design 具体设计 25 40 Coding 具体编码 200 500 Code Review 代码复审 60 60 Test

Leetcode36. 有效的数独

↘锁芯ラ 提交于 2020-03-17 07:29:15
Leetcode36. 有效的数独 题目: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例 1: 输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: true 题解: 可以使用 box_index = (row / 3) * 3 + columns /

二进制-高效位运算

自古美人都是妖i 提交于 2020-03-08 10:11:44
数独 数独是介绍位运算的好例子,运用位运算和不运用效率差别还是挺大的。我们先看数独需求: 1、当前数字所在 行 数字均含1-9,不重复 2、当前数字所在 列 数字均含1-9,不重复 3、当前数字所在 宫 (即3x3的大格)数字均含1-9,不重复(宫,如下图每个粗线内是一个宫) 、 常规算法 若是我们采用常规方式的,每填写一个数字,需要检查当前行、列,宫中其他位置是否有重复数字,极端情况下需要循环27(3*9)次来进行检查,我们看下常规算法下check int check(int sp) { // 檢查同行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0 ; if(!fg) fg= check1(sp, startH[sp], addH) ; // 檢查同列有沒有相同的數字 if(!fg) fg= check1(sp, startV[sp], addV) ; // 檢查同行有沒有相同的數字 if(!fg) fg= check1(sp, startB[sp], addB) ; // 檢查同九宮格有沒有相同的數字 return(fg) ; } int check1(int sp, int start, int *addnum) { // 檢查指定的行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0, i, sp1 ; //万恶的for循环 for(i=0; i

解数独(回溯)

大兔子大兔子 提交于 2020-03-03 22:51:28
我觉得这题的思路还是很简单的,回溯法 就是模拟人解数独时的简单想法: 人在解数独的时候要注意每一行、每一列、每一个子数独中哪些数字已经被使用过了; 一行一行的进行填充,填充完一行就到下一行继续填充; 如果一个单元格中不为空,则去下一个单元格; 如果一个单元格为空,我们就看一下这个单元格所属的行、列、子数独中有哪些数字没有使用过,就将未使用过的数字填入单元格,并且记录这个被填入的数字在此单元格所属的行、列、子数独中已经被使用过了; 如果出现因为之前填充空格时选择不佳,导致无法继续填写空格的情况,就逐步擦除之前填入的数字,并将被擦除的数字在所属的行、列、子数独中设置为未使用的状态后,重新选择下一个未使用过的数字进行填充,尝试继续完成填充; 如果已经填充完所有行,即成功解数独。 思路理清后,代码很快就写好了: class Solution { public : void solveSudoku ( vector < vector < char >> & board ) { for ( int i = 0 ; i < 9 ; i ++ ) for ( int j = 0 ; j < 9 ; j ++ ) { if ( board [ i ] [ j ] != '.' ) { rows [ i ] [ board [ i ] [ j ] - '0' - 1 ] = true ; cols [

Leetcode 36. 有效的数独

偶尔善良 提交于 2020-03-03 05:23:33
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 简单的三次遍历: class Solution { public : bool isValidSudoku ( vector < vector < char >> & board ) { if ( board . size ( ) <= 0 ) { return false ; } unordered_map < char , int > check ; // 检查每一行 for ( int i = 0 ; i < board . size ( ) ; i ++ ) { for ( int j = 0 ; j < board [ 0 ] . size ( ) ; j ++ ) { if ( board [ i ] [ j ] != '.' ) { auto iter = check . find ( board [ i ] [ j ] ) ; if ( iter == check . end ( ) ) { check [ board [ i ] [ j ] ] = 1 ; } else { return false ; } } } check .

用Prolog解决数独问题

房东的猫 提交于 2020-02-29 18:45:02
我们先了解一下什么是数独 数独( shù dú )是源自 18 世纪瑞士的一种数学游戏。它是一种运用纸、笔进行演算的逻辑游戏。数独有多种类型,我们仅以其中一种类型作为本文实例。 玩家需要根据 9×9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫( 3*3 )内的数字均含 1-9 ,不重复。 方格 水平方向有九横行,垂直方向有九纵列的矩形,画分八十一个小正方形,称为九宫格( Grid ),如图一所示,是数独( Sudoku )的作用范围。 行:水平方向的每一横行有九格,每一横行称为行(Row) 列:垂直方向的每一纵列有九格,每一纵列称为列( Column ) 宫:三行与三列相交之处有九格,每一单元称为小九宫( Box 、 Block ),简称 宫 ,如图四所示(在杀手数独中,宫往往用单词 Nonet 表示) 上述行、列、宫、单元格统称为单元( Unit );而行、列、宫统称为区域( Region )。 区块 由三个连续宫组成大行列( Chute ),分大行( Floor )及大列( Tower )。 第一大行:由第一宫、第二宫、第三宫组成。 第二大行:由第四宫、第五宫、第六宫组成。 第三大行:由第七宫、第八宫、第九宫组成。 第一大列:由第一宫、第四宫、第七宫组成。 第二大列:由第二宫、第五宫、第八宫组成。 第三大列:由第三宫、第六宫、第九宫组成。

数独游戏问题

微笑、不失礼 提交于 2020-02-26 14:55:16
问题描述: 九宫格是在81个格子(9×9)中,要满足以下条件: (1)每个横行和竖列中的9个格子都包含数字1~9,且不重复; (2)每个颜色相同的9个格子(3×3)都包含数字1~9,且不重复。如图所示: (3)保证输入的数据是合法的,而且题目有唯一的解。 要求:找出给定数字的九宫格。 输入形式:输入9行9列81个数字,其中0表示要填的数字。 输出形式:输出满足条件的九宫格。 某测试样例如下: 输入形式: 061030020 050008107 000007034 009006078 003209500 570300900 190700000 802400060 040010250 输出形式: 7 6 1 9 3 4 8 2 5 3 5 4 6 2 8 1 9 7 9 2 8 1 5 7 6 3 4 2 1 9 5 4 6 3 7 8 4 8 3 2 7 9 5 1 6 5 7 6 3 8 1 9 4 2 1 9 5 7 6 2 4 8 3 8 3 2 4 9 5 7 6 1 6 4 7 8 1 3 2 5 9 解题思路:利用深度搜索遍历解决,依次添加数字看是否符合条件,走不通时就回溯。这题的遍历方式和走迷宫深度搜索的遍历方式不太一样,走迷宫是依次走四个方向(上下左右)进行遍历;而这题可以直接一行一行的遍历。 代码如下: import java . util . * ; public

LeetCode 题解 | 36.有效的数独(标记法 C++)

拈花ヽ惹草 提交于 2020-02-19 20:25:41
题目描述(中等难度) 原题链接 算法 (标记法) O ( n ∗ m ) O(n*m) O ( n ∗ m ) 对于每个已填的数,用row、col和box数组来表示当前位置是否可以填该数 如果出现冲突,则返回false 如果都不冲突,则返回true 时间复杂度是 O ( n ∗ m ) O(n*m) O ( n ∗ m ) C++代码 class Solution { public : // row[x][i]表示第x行是否已经填过数字i(1-9) // col[y][i]表示第y行是否已经填过数字i(1-9) // box[x / 3][y / 3][i]表示第[x/3,y/3]个box是否已经填过数字i(1-9) bool row [ 9 ] [ 10 ] , col [ 9 ] [ 10 ] , box [ 3 ] [ 3 ] [ 10 ] ; bool isValidSudoku ( vector < vector < char >> & board ) { int n = board . size ( ) , m = board [ 0 ] . size ( ) ; for ( int x = 0 ; x < n ; x ++ ) { for ( int y = 0 ; y < m ; y ++ ) { if ( board [ x ] [ y ] != '.' ) {

leetcode_36_有效的数独

痴心易碎 提交于 2020-02-16 00:57:39
有效的数独 描述 中等 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例 输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: true 输入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".",

使用 Python 解 数独

余生颓废 提交于 2020-02-05 02:00:44
import threading, time, sys, os, copy from multiprocessing import Process, Pool """ # 每一宫分组 a[0-2][0-2] a[0-2][3-5] a[0-2][6-8] a[3-5][0-2] a[3-5][3-5] a[3-5][6-8] a[6-8][0-2] a[6-8][3-5] a[6-8][6-8] # 每一列分组 a[0-8][0] a[0-8][1] a[0-8][2] a[0-8][3] a[0-8][4] a[0-8][5] a[0-8][6] a[0-8][7] a[0-8][08] # 每一行分组 a[0][0-9] a[1][0-9] a[2][0-9] a[3][0-9] a[4][0-9] a[5][0-9] a[6][0-9] a[7][0-9] a[8][0-9] """ """中解""" # a="""904030200 # 600000048 # 001004000 # 400003029 # 090000010 # 820600003 # 000100700 # 240000001 # 009070304""" """小解""" # a="""000200049 # 000007500 # 001000302 # 002401090 # 054309680