【问题标题】: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 并尝试每个数字 - 它们都不适合,因此它一直返回并退出程序。

标签: c++ recursion backtracking sudoku recursive-backtracking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    正确的做法是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多