为啥这个“数独求解器”算法不起作用
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。
然后再检查是否还有单元格需要填充。
如果没有单元格,您就完成了。
如果单元格仍然存在,请取消选择数字
转到下一个选项。
【讨论】:
以上是关于为啥这个“数独求解器”算法不起作用的主要内容,如果未能解决你的问题,请参考以下文章