递归-最蠢数独穷举算法,就是不出结果,求解

问题描述

最蠢数独穷举算法,就是不出结果,求解

用C++/C写了个数独暴力破解算法,运用递归来破解数独
搞了半天不知道错哪。。求前辈指教。。

PS:数独就是9×9=81个格子
要把9组1~9一共81个数字填入格子中
要求:
每一行不能有相同的数
每一列不能有相同的数
每一小宫(9个格子)不能有相同的数

 #include <iostream>
using namespace std;
void Sudoku(int x,int y);    //放数
int Judge(int x,int y,int a);    //判断能否放数

int Array[9][9] = {    //数独
    {9,0,0,0,2,0,0,0,0},
    {1,0,0,0,0,6,0,4,0},
    {0,6,4,0,3,0,0,0,0},
    {6,9,7,0,8,0,0,0,0},
    {0,4,0,1,0,0,2,0,3},
    {3,0,0,0,5,0,0,0,8},
    {0,0,0,0,4,0,0,3,2},
    {0,7,0,3,1,0,0,0,0},
    {0,1,0,0,6,8,0,9,7}
};

int main(){
    Sudoku(0,0);    //从(0,0)开始放数

    for(int i=0;i<9;i++){    //打印
        for(int j=0;j<9;j++)
            cout<<Array[i][j]<<"  ";
        cout<<endl;
    }
    cout<<endl;

    return 0;
}

void Sudoku(int x,int y){
    if(Array[x][y]==0){    //如果该位没数表示可以放数
        int temp_A = 0;    //临时变量
        int temp_B = 0;
        for(int a=1;a<10;a++){    //从1到9循环放数
            if(Judge(x,y,a)==1){    //如果可以放数
                if(x<8){    //从行放数
                    Array[x][y]=a;    //就放数
                    if(Array[x+1][y]==0)    //下一个是不是可放数位
                        temp_A=1;    //是的话临时变量为1
                    else
                        temp_A=0;    //不是则为0
                    Sudoku(x+1,y);    //去下一个位子放数
                    if(temp_A==1)    //递归回来以后,如果临时变量为1,即下一位原本是0
                        Array[x+1][y]=0;    //将下一位置0(还原)
                }
                if(x==8&&y<8){    //行满了去下一列,重复上述步骤
                    Array[x][y]=a;
                    if(Array[0][y+1]==0)
                        temp_B=1;
                    else
                        temp_B=0;
                    Sudoku(0,y+1);
                    if(temp_B==1)
                        Array[0][y+1]=0;
                }
            }
        }
    }
    if(Array[x][y]!=0){    //有数则直接去下一格放数
        if(x<8)
            Sudoku(x+1,y);
        if(x==8&&y<8)
            Sudoku(0,y+1);
    }
}

int Judge(int x,int y,int a){
    int row,len;
    row = x / 3;
    row = row * 3;
    len = y / 3;
    len = len * 3;
    for(int i=0;i<9;i++){
        if(a==Array[i][y])
            return 0;    //每列上有相同的则返回0说明不行
        if(a==Array[x][i])
            return 0;    //每行上有相同的则返回0说明不行
    }
    for(int i=row;i<row+3;i++)
        for(int j=len;j<len+3;j++)
            if(a==Array[i][j])
                return 0;    //每小宫里有相同的也返回0
    return 1;    //通过考研就返回1说明能放
}

解决方案

http://bbs.csdn.net/topics/390039859
这是我写的,用的是C#,不过你可以参考下

解决方案二:

void DFS(int curX, int curY) {
if (curY >= kArrSize) {
++curX;
curY = 0;
}

if (curX*kArrSize + curY >= kArrSize*kArrSize) {
    PrintData();
    return;
}

while (curX < kArrSize && curY < kArrSize && Array[curX][curY] > 0) {
    while (curY < kArrSize && Array[curX][curY] > 0)
        ++curY;
    if (curY >= kArrSize)
        curY = 0;
    else
        break;

    ++curX;
}

if (curX < kArrSize && curY < kArrSize) {

    for (int nCurLowerVal = 1; nCurLowerVal <= kArrSize; ++nCurLowerVal) {
        Array[curX][curY] = nCurLowerVal;
        if (JudgeCurRowAndColIsLegal(curX, curY))
            DFS(curX, curY + 1);
    }
    Array[curX][curY] = 0;
} else {
    DFS(curX, curY+1);
}

}

解决方案三:

数独求解算法
数独的求解算法
数独求解算法

时间: 2024-10-29 21:50:36

递归-最蠢数独穷举算法,就是不出结果,求解的相关文章

PHP经典题:百钱百鸡问题(穷举算法)

PHP经典题:百钱百鸡问题(穷举算法)

C++基本算法思想之穷举法_C 语言

穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场合. 穷举算法基本思想穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否符合要求,如果不满足则执行第(1)步来搜索下一个可能的情况:如果符合要求,则表示寻找到一个正确答案. 在使用穷举法时,需要明确问题的答案的范围,这

使用MD5变换算法来防止穷举破译密码

换算|算法 MD5是在Web应用程序中最常用的密码加密算法.由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文. 回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得.但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径.然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文-->MD5-->密文.因此,我们可以使用变换的M

算法系列(十六) 使用穷举法解猜结果游戏

一. 引言 穷举是解决问题的一种常用思路,当对一个问题无从下手的时候,可以考虑在问题 域允许的范围内将所有可能的结果穷举出来,然后根据正确结果的判断规则对这些结果逐个验证,从而找 出正确的结果.采用穷举的方法求解问题的答案比较适合计算机做,对这种体力活它们没有怨言,本文就 以常见的两个猜结果的题目为例,介绍一下如何通过计算机程序解决此类问题,顺便介绍一下穷举法常见 的算法结构和实现方式. 二. 猜结果游戏的分析过程 先来看一个问题,有五个运动员 (甲.乙.丙.丁.戊)参加运动会,分别获得了一百米

请教一个穷举的算法:)列出字符串

问题描述 问题描述:现在想从ABCD四个字符想穷举后得到:ABCDAAABACADAAAAABAACAADABAABBABCABDACAACBACCACDADAADBADCADD.....DDDDD等等,不计各个位数,但最长的长度为5即DDDDD,求出各种字符组合.请教高手指点:) 解决方案 解决方案二:四进制!!!代码就不用写了吧解决方案三:请问要怎么做四进制呢?还有要是如果字符更多,穷举的长度也变长呢?请教:)解决方案四:又是一个全排列问题.解决方案五:楼上的有好招么?请教:)解决方案六:[

JavaScript实现穷举排列(permutation)算法谜题解答_javascript技巧

谜题 穷举一个数组中各个元素的排列 策略 减而治之.递归 JavaScript解 复制代码 代码如下: /**  * Created by cshao on 12/23/14.  */ function getPermutation(arr) {   if (arr.length == 1) {     return [arr];   }   var permutation = [];   for (var i=0; i<arr.length; i++) {     var firstEle =

穷举密码算法

//*******************************************************************//在许多情况下我们需要穷举组合的算法,比如密码词典.//这个算法的关键是密码下标进位的问题.//另外本例子中的写文件语句效率比较低,为了降低算法复杂度没有优化.//如果要提高写文件的效率,可以使用缓冲区,分批写入.//*********************************************breath.cnpick.com***** voi

穷举法解24点游戏

24点游戏: 输入:n1,n2,n3,n4 输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式 穷举法: 对4个数字全排列有4!=24种排列. 4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况. 对于4个数字而言,共有以下5中加括号的方式: (A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D). 所以遍历的表达式最多有24*64*5=7680种.即使采用逆波兰表达式,总

C++实践参考解答 穷举法解决组合问题

[项目:穷举法解决组合问题](自选两题完成,其他的想一想即可.当然,全做完收效更好)先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 例题:小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法? 问题分析与算法设计:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数.首先对五本书从1至5进行编号,然后使用穷举的方法.假设三个人分别借这五本书中的一本,当三个人所借的书的编