为啥这个“数独求解器”算法不起作用

Posted

技术标签:

【中文标题】为啥这个“数独求解器”算法不起作用【英文标题】:Why this "Sudoku solver" algorithm does not work为什么这个“数独求解器”算法不起作用 【发布时间】:2020-03-02 20:19:18 【问题描述】:

我试图写一个数独求解器算法,它应该像这样工作: 选一个空格, 选择一个号码并验证是否可以在该位置拥有该号码, 如果不选择其他号码, 递归地尝试找到一个解决方案,如果没有可能的回溯,直到找到一个。 问题是这个打印绝对没有,我不知道该怎么做请帮忙。

#include<bits/stdc++.h>

using namespace std;

bool possible(int y,int x,int n,int grid[9][9])
    for(int i=0;i<9;i++)
        if(grid[y][i]==n)
            return false;
    
    for(int i=0;i<9;i++)
        if(grid[i][x]==n)
            return false;
    

    int y0 = y/3;
    int x0 = x/3;

    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            if(grid[y0+i][x0+j]==n)
                return false;
        
    

    return true;



void display(int grid[9][9])
    for(int y=0;y<9;y++)
        for(int x=0;x<9;x++)
            cout<<grid[y][x]<<" ";
           
        cout<<endl;
    


void solve (int grid[9][9])
    for(int y=0;y<9;y++)
        for(int x=0;x<9;x++)
            if(grid[y][x]==0)
                for(int n=1;n<10;n++)
                    if(possible(y,x,n,grid))
                        grid[y][x] = n;
                        solve(grid);
                        grid[y][x] = 0;
                    
                
                return;
            
           
    
    display(grid);


int main()
    int grid[9][9];
    ifstream in ("input.txt");
    for(int y=0;y<9;y++)
        for(int x=0;x<9;x++)
            in>>grid[y][x];
        
    
    solve(grid);

【问题讨论】:

我不知道该怎么办请帮忙。 -- How to debug small programs 输入是什么? 问题是这个打印完全没有,我不知道该怎么做使用你的调试器找出原因。具体来说,它是永远循环,还是在输入有效时找不到解决方案。 你也可以,除了调试,这是最好的开始,把std::cout信息放在你的solve(...)另外:Why should I not #include <bits/stdc++.h>Why is “using namespace std;” considered bad practice 程序退出而不打印任何内容,因为您的回溯不起作用并且它提前退出。从 000000200,080007090,602000500,070060000,000901000,000020040,005000603,090400070,006000000 开始,solve() 在 957643281,483107090,602000500,070060000,000901000,000020040,005000603,090400070,006000000 上达到 x=3,y=1 并尝试每个数字 - 它们都不适合,因此它一直返回并退出程序。 【参考方案1】:

它从不打印解决方案,原因很简单。

太慢了,永远找不到。你可能会在宇宙热寂之前看到一些东西,但不能保证。

【讨论】:

【参考方案2】:

虽然您在输出中看不到任何内容是您面临的问题,但我认为主要问题是您的solve 不正确,它绝对有可能无限递归。

在您的solve 中,您需要首先检查是否有可以填充的单元格,然后您才能进行实际工作。如果没有首先进行检查,您最终会一次又一次地做同样的工作。

正确的做法是:

    检查是否有可以填充的单元格,获取其i,j 如果没有,退出 如果是,请从 1 到 9 中选择一个数字,看看是否可以用该数字填充位置 i,j。 然后再检查是否还有单元格需要填充。 如果没有单元格,您就完成了。 如果单元格仍然存在,请取消选择数字 转到下一个选项。

【讨论】:

以上是关于为啥这个“数独求解器”算法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

回溯数独求解器不起作用

为啥这个数独求解器返回相同的板而不解决任何问题?

具有回溯的数独求解器不能总是检测到多个解决方案

为啥贪心硬币找零算法对某些硬币组不起作用?

为啥这个 CATransition 不起作用?

为啥这个重定向不起作用?