我的数独回溯算法在第7行之后不起作用我究竟做错了什么?

问题描述

我的代码运行了,但是当我尝试使用功能打印电路板并且当我检查算法是否至少解决了电路板时,它最多只能求解第7行然后停止。

在查看我做错了什么的过程中,我在初始化的最后一个函数中包含checkforzero的if语句之后立即打印了我的板子。这就是我发现我的代码只能解决难题的第七行的方法。这也使我感到困惑,即使通过引用sodoku_board矢量,在通过主函数中的算法求解后,它仍然不会输出更改后的7行的值。

#include<iostream>
#include<vector>
#include<algorithm>

void print_board(std::vector<std::vector<int>> sudoku_board);
std::vector<std::vector<int>> missing_nums(std::vector<std::vector<int>> sudoku_board);
bool check_viable(std::vector<std::vector<int>> sudoku_board,int row,int column,int number);
bool checkforzero(std::vector<std::vector<int>> sudoku_board,int &row,int &column);
bool solve_board(std::vector<std::vector<int>> &sudoku_board,std::vector<std::vector<int>> missing);

int main(){
    std::vector<std::vector<int>> missing;
    
    //created board
    std::vector<std::vector<int>> sudoku_board = {
        {1,8,5,6},{0,0},{5,3,2,7,{2,1,9,8},{8,4,5},4},{9,6,1}
    };

    print_board(sudoku_board);
    missing = missing_nums(sudoku_board);
    bool end = solve_board(sudoku_board,missing);
    print_board(sudoku_board);
}
//simply printing the board inputed
void print_board(std::vector<std::vector<int>> sudoku_board){
   std::cout<<"\n";
    for(auto c : sudoku_board){
      for(auto d : c){
         std::cout<<d<<" ";
      }
      std::cout<<"\n";
   }
    std::cout<<"\n";
}
//find the missing nums in each row
std::vector<std::vector<int>> missing_nums(std::vector<std::vector<int>> sudoku_board){
  std::vector<std::vector<int>> r(9);
  for(int c = 0; c < 9; c++)
     for(int i = 1; i <= 9; i++)
        if(find(sudoku_board[c].begin(),sudoku_board[c].end(),i) == sudoku_board[c].end())
                    r[c].push_back(i);
  return r;
}
//checks if the number can be inputed on board
bool check_viable(std::vector<std::vector<int>> sudoku_board,int number){
    int row_change;
    //checks vertical
    for(int rowed : sudoku_board[row])if(rowed == number)return false;
    //checks horizontal
    for(int i = 0; i < sudoku_board.size(); i++)if(sudoku_board[i][column] == number)return false;
    //checks box
    while(row != 0 && row != 3 && row != 6)row--;
    while(column != 0 && column != 3 && column != 6)column--;
    for(int v = column; v <= column + 2; v++)if(sudoku_board[row+1][v] == number || sudoku_board[row+2][v] == number || sudoku_board[row][v] == number)return false;
    return true;
}

bool checkforzero(std::vector<std::vector<int>> sudoku_board,int &column){
    for(int i = 0; i < 9; i++){
        for(int v = 0; v < 9; v++){
            if(sudoku_board[i][v] == 0){
                row = i;
                column = v;
                return true;
            }
        }
    }
    return false;
}

bool solve_board(std::vector<std::vector<int>> &sudoku_board,std::vector<std::vector<int>> missing){
    int row,column;
    if(!checkforzero(sudoku_board,row,column))
        return true;
    print_board(sudoku_board);
    for(int d = 0; d < missing[row].size(); d++){
        if(check_viable(sudoku_board,column,missing[row][d])){
            sudoku_board[row][column] = missing[row][d];
            if(solve_board(sudoku_board,missing))
                return true;
            sudoku_board[row][column] = 0;
        }
    }
    return false;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)