数独

leetcode 36 有效的数独

大憨熊 提交于 2020-02-02 14:33:11
有效的数独 https://leetcode-cn.com/problems/valid-sudoku/ 代码 public static boolean isValidSudoku(char[][] board) { List<Set<Integer>> rowList = new ArrayList<>(9); List<Set<Integer>> colList = new ArrayList<>(9); List<Set<Integer>> blockList = new ArrayList<>(9); for (int i = 0; i < 9; i++) { rowList.add(new HashSet<>(9)); colList.add(new HashSet<>(9)); blockList.add(new HashSet<>(9)); } for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { char num = board[i][j]; Set<Integer> rowSet = rowList.get(i); Set<Integer> colSet = colList.get(j); int rowNum = (i / 3) * 3 + j

leetcode算法整理36有效的数独

房东的猫 提交于 2020-01-31 09:27:10
LEETCODE算法注解36: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 说明: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 给定数独序列只包含数字 1-9 和字符 '.' 。 给定数独永远是 9x9 形式的。 解法说明:在我看来,这道题不论是处理行,还是列,或者九宫格都不是问题,难点在于如何巧妙的判定1-9的不重复出现。 参考:https://leetcode-cn.com/problems/valid-sudoku/solution/java-wei-yun-suan-xiang-jie-miao-dong-zuo-biao-bia/ 给出一种规范解法。 难点1:如何表示遍历一个九宫格呢? 上图不同颜色代表不同的九宫格。 我们知道某个位置的坐标是第几个宫格第几个位置,那如何知道它是哪一个坐标呢 。 A是5宫格3位置。 一行有三个九宫格,(5/3)*3表示5上面有3小行,一个小的九宫格每行有3小格,3/3代表在第5个九宫格中3位置上面还有1小行,1+3=4,说明A是第4行。 求列同理:(5%3)*3+3%3=6 给出规律

简单九宫格数独

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-31 05:46:10
#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 10; struct node { int x, y, id; } s[110]; int n = 9; int top = 0; int ma[N][N]; int sta[110], tot; int row[N][N], col[N][N]; int blo[N][N], bloid[N][N]; void dfs(int id) { int x = s[sta[id]].x; int y = s[sta[id]].y; if(id == tot) { cout << "-----------------------" << endl; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cout << ma[i][j] << " "; if(j % 3 == 2) cout << " "; } if(i % 3 == 2) cout << endl; cout << endl; } exit(0); } for(int i = 1; i <= 9; i++) { if(!row[x][i] && !col

Leetcode初学——有效的数独

给你一囗甜甜゛ 提交于 2020-01-31 04:12:36
题目: 归纳一下题目的要求:给出一个char型的二维数组九宫格,判断每一行,每一列,每一格内是否有重复的数字 代码如下: class Solution { public boolean isValidSudoku(char[][] board) { Set<Character> set1=new HashSet<Character>(); Set<Character> set2=new HashSet<Character>(); Set<Character> set3=new HashSet<Character>(); for(int i=0;i<board.length;i++){ set1.clear(); set2.clear(); set3.clear(); int count1 = 0; int count2 = 0; int count3 = 0 ; int row=i/3; int col=i%3; for(int j=0;j<board.length;j++){ //对行进行判断 if(board[i][j]!='.'){ count1++; set1.add(board[i][j]); } //对列进行判断 if(board[j][i]!='.'){ count2++; set2.add(board[j][i]); } //对格进行判断 if(board[row

Java版本的DLX解决数独算法

元气小坏坏 提交于 2020-01-30 07:30:59
DLX又称作精确覆盖问题,而今天要说的就是把解数独这个问题转化为一个精确覆盖问题,然后来解决它。 其实这是一个很好的解决问题的思路,很多问题都可以转化为一个精确覆盖问题,然后用接下来这个算法来解决它。 关于DLX的思想,网上有不少的解释,这里我就不再赘述,我会在我的另一篇博客里讲解原理。 首先是整个代码的结构。 总共分为四个类,分别是: 主类(StartPoint) 转换器类(Transfer) 节点类(Node) 求解器类(Solver) 这就是我们的代码的主要结构,下面我们将展示代码的细节。 主类(StartPoint) 这是主类,也是整个程序的入口,负责从文件读取数据,调用各种其他类,然后输出结果到文件中,具体如下: package dLX ; import java . io . File ; import java . io . FileReader ; import java . io . FileWriter ; import java . io . IOException ; import java . util . Vector ; public class StartPoint { public static void main ( String [ ] args ) { // TODO Auto-generated method stub File input

五、测试-六、优化方案

我是研究僧i 提交于 2020-01-26 02:56:31
五、测试 1.单元测试    单元测试的方式是黑盒测试,即通过每个环节的输入输出情况进行测试。程序由四个类组成,对应生成四个测试类,使用Junit5对其中的主要方法进行测试。测试的大致思路是预先设计较为简单的数独用例,生成新的对象,运行方法,并将阶段性的结果与预先计算的结果相比较。    有些方法具有返回值,便于设计测试类,例如对 Main::isNumber()进行测试: //Main::isNumber public static boolean isNumber(String str){ String reg = "^[0-9]+?$"; return str.matches(reg); }//MainTest::testIsNumber @Test final void testIsNumber() { Assert.assertEquals(true, Main.isNumber("100")); Assert.assertEquals(true, Main.isNumber("10a")); Assert.assertEquals(true, Main.isNumber("4.5")); }    对于更多没有返回值的方法,采取验证阶段结果的方法,预测方法执行后对象属性的变化并加以验证。例如对SudokuGenerator::creatFirstBlock()方法的测试

leetcode力扣36.有效的数独

可紊 提交于 2020-01-22 19:05:34
判断一个 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 示例 2: 输入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".","1",

LC36. 有效的数独

偶尔善良 提交于 2020-01-22 08:26:40
/** * @Classname Solution1 * @Description * @Date 2020/1/13 18:25 * @Author SonnSei */ public class Solution1 { public boolean isValidSudoku ( char [ ] [ ] board ) { int [ ] [ ] rowArray = new int [ 9 ] [ 10 ] ; int [ ] [ ] colArray = new int [ 9 ] [ 10 ] ; int [ ] [ ] boxArray = new int [ 9 ] [ 10 ] ; for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = 0 ; j < 9 ; j ++ ) { char c = board [ i ] [ j ] ; if ( c == '.' ) continue ; int digit = c - '0' ; rowArray [ i ] [ digit ] ++ ; colArray [ j ] [ digit ] ++ ; int boxIndex = ( i / 3 ) * 3 + j / 3 ; boxArray [ boxIndex ] [ digit ] ++ ; if (

数独游戏代码

折月煮酒 提交于 2020-01-21 15:40:42
//数独游戏c++ class CSudoku { int map[9][9]; int blanks; int smod; int solves; int check(int,int,int*); void dfs(); public: enum{ANY=0,ALL=1}; CSudoku(int); CSudoku::CSudoku(int *data); void SudokuGenerator(int); //随机生成数独,n越大越难 void SudokuGenerator(int *data);//人工指定数独 //virtual ~CSudoku(); void display();//显示数独 int resolve(int mod=ALL);//解数独 void analyze(); }; #include "stdio.h" #include "stdlib.h" #include "time.h" #include "iostream" #include "iomanip" //要用到格式控制符 using namespace std; CSudoku::CSudoku(int n){ int j; j=rand()%3; blanks=n+j; SudokuGenerator(blanks); cout<<endl<<"随机数独: --->(Y轴)[x

软件工程基础个人项目——数独(3)

别来无恙 提交于 2020-01-20 07:56:24
软件工程基础个人项目——数独 点击这里可看github上具体链接 软件工程基础个人项目——数独 本次个人项目关于数独的生成与求解 PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 Estimate 估计这个任务需要多少时间 1520 Development 开发 Analysis 需求分析 20 Design Spec 生成设计文档 60 Design Review 设计复审 Coding Standard 代码规范 Design 具体设计 120 Coding 具体编码 600 Code Review 代码复审 200 Test 测试(自我测试,提交代码,代码修改) 400 Reporting 报告 30 Test Report 测试报告 30 Size Measurement 计算工作量 30 Postme & Process Improvement Plan 事后总结并提出过程改进计划 30 合计 1520 思路描述 最开始看到题目的时候,感觉压力很大,因为在此之前我从未了解过数独,担心自己不能很好的理解数独,更不要说通过代码编写让计算机完成数独的求解和生成了。但是在网上是可以找到很多之前学姐学长们智慧的结晶,在本次个人项目上为我提供了很多帮助