求解数独

dfs爆搜,从第一个空开始试探

bool check(int sodu[10][10], int n, int m)
{
    int heng = n / 9;
    int zong = n % 9;
    int a = heng / 3, b = zong / 3;
    a *= 3, b *= 3;
    int i, j;
    for (i = 0; i < 9; i++)
        if (sodu[i][zong] == m)
            return false;
    for (i = 0; i < 9; i++)
        if (sodu[heng][i] == m)
            return false;
    for (i = a; i < a + 3; i++)
    {
        for (j = b; j < b + 3; j++)
        {
            if (sodu[i][j] == m)
                return false;
        }
    }
    return true;
}
void dfs(int sodu[10][10], int n, int &flag)
{
    if (n > 80)
    {
        flag = 1;
        return;
    }
    if (sodu[n / 9][n % 9] == 0)
    {
        for (int i = 1; i <= 9; i++)
        {
            if (check(sodu, n, i))
            {
                sodu[n / 9][n % 9] = i;
                dfs(sodu, n + 1, flag);
                if (!flag)
                    sodu[n / 9][n % 9] = 0;
                else
                    return;
            }
        }
    }
    else
        dfs(sodu, n + 1, flag);
}

原文地址:https://www.cnblogs.com/xiao-ma-running/p/8672012.html

时间: 2024-07-29 12:15:23

求解数独的相关文章

求解数独回溯算法

实现的java代码如下: //判断a[i][j]取值val是否有效 public boolean isValid(int[][] a, int i, int j, int val){ //判断是否跟同行冲突 for(int j1=0;j1<9;j1++){ if(a[i][j1]==val) return false; } //判断是否跟同列冲突 for(int i1=0;i1<9;i1++){ if(a[i1][j]==val) return false; } //找出a[i][j]所在的九

回溯法求解数独算法(C语言)

没有对输入的待解数独进行一般性验证(同一行.一列以及同一个小九宫格都不能出现重复数字) 算法利用回溯的思想: 从第一个空白处开始,找到其候选解(排除同行.同列以及同一小九宫格的所有出现过的数字,剩下未出现的数字都是候选解)的第一个值填入数独. 对第二个空白执行第一步(前面所填入的数字对此空白处有影响). 当出现某个空白的候选解个数为0时,就开始回溯,找到第一个候选解多于一个的,将其在使用的候选解设为不可取(本程序取值为-1),找到其下一个候选解,继续上面的步骤! 直到所有空白处填满,运算完成,输

LeetCode 37 Sudoku Solver(求解数独)

题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description Problem : 解决数独问题,给出一个二维数组,将这个数独进行求解. 思路: 嵌套循环,三层循环体,每一行,每一列,填入从1到9的数字.判断填入之后是否合理 判断数独是否合理的函数 参考代码: package leetcode_50; /*** * * @author pengfei_zheng * 求解数独问题 */ public class Solutio

[LeetCode] Sudoku Solver 求解数独

Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by the character '.'. You may assume that there will be only one unique solution. A sudoku puzzle... ...and its solution numbers marked in red. 这道求解数独的题是在之

[LeetCode] 37. Sudoku Solver 求解数独

Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy all of the following rules: Each of the digits 1-9 must occur exactly once in each row. Each of the digits 1-9 must occur exactly once in each column.

高效算法求解数独

title: 高效算法求解数独 date: 2019-12-26 17:55:16 tags: 数据结构与算法 categories: 数据结构与算法 背景 ??之前上python课的时候,有一次实验是求解数独,要求时间复杂度要低:为此老师讲解了一个高效的数独算法,我觉得算法挺有意思的,写篇博客记录一下. 描述 首先需要知晓数独的两个规则: 若某个位置的值已经确定,那么,和这个位置在同一行,同一列,同一个3×3的格子,都不能填写这个值,比如,九宫格(1,1)位置的值为2,那么,第一行,第一列,以

求解数独的所有解法,java编程实现

数独是一种考验眼力和逻辑的小游戏,关键在这个"独"字上,横竖不能重复,方块不能重复.今天我给大家介绍一种利用"循环+递归+回溯"的办法来用Java程序替我们完成数独. 先给代码随后讲解: 1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class T2 { 5 public static final int N=3; 6 public static void main(String[] a

C++求解数独

1 #include <iostream> 2 using namespace std; 3 #include <vector> 4 #include <utility> 5 const int MAX_SIZE = 9; 6 7 //int result[MAX_SIZE][MAX_SIZE] = { 8 // {1, 2, 3, 4, 5, 6, 7, 8, 9}, 9 // {4, 6, 7, 1, 8, 9, 3, 2, 5}, 10 // {5, 8, 9,

leetcode python 037 求解数独

import numpy as npimport syssys.setrecursionlimit(1000) #例如这里设置为一百万 def get1(n):    if n<3:        return 0    if n<6:        return 3    return 6 def get2(n):    if n<3:        return 3    if n<6:        return 6    return 9 def get3(arr,i,j)