gpt4 book ai didi

c++ - 从理论上使用回溯递归解决数独难题

转载 作者:太空狗 更新时间:2023-10-29 23:51:53 25 4
gpt4 key购买 nike

回答:我的伪代码在递归方面是模糊的,但是这个视频和下面的资源很有帮助

http://www.youtube.com/watch?v=p-gpaIGRCQI

http://norvig.com/sudoku.html

无法掌握这种回溯递归算法在数独游戏中的实现。

我正在尝试使用递归回溯来解决数独难题。考虑到我正在处理的问题领域,我仍然无法在脑海中形成通用算法。

我尝试使用的回溯算法似乎是标准的,但我无法遵循逻辑并知道下面发生了什么。

包括回溯算法及其定义。

编辑:“同样,取出类定义,留下声明,放上伪代码”

这是我利用它的伪代码。

伪代码(C++实现)回溯游戏 (81,9)//表示游戏的所有可能的输入和值组合

    //All info is loading into a vector of size 81 with the initial state 
//puzzle = the initial state 9x9 grid from left to right of integers
vector <int> puzzle
while(!not solved && not the end of the vector){
for(int i =puzzle.begin::iterator i , puzzle.end()) //from 0-80 of the vector until end
if puzzle[i] != 0
//leave alone, original state of board
else
if (valid move) //a guess is allowed in this column/row/square of the board
solution[i] = puzzle_guess[i] //guess a move and insert
else // one of previous guesses were wrong
game.prune(i); //backtracks, or reverses guesses until valid move
}

//游戏初始状态

    4 0 0  6 0 5  2 0 3
0 0 0 0 4 9 0 7 5
0 0 0 1 0 7 6 0 0

6 0 1 0 0 0 4 8 7
0 8 0 0 0 0 0 3 0
2 7 4 0 0 0 5 0 6

0 0 8 7 0 3 0 0 0
3 1 0 9 6 0 0 0 0
7 0 9 2 0 8 0 0 1

谢谢

唯一知道的线索是使用回溯游戏 (81,9) 的声明//表示 81 个可能的数字和 9 个不同的选项的 9。

#ifndef BACKTRACK_H
#define BACKTRACK_H

#include <vector>
#include <algorithm>

class BackTrack {
public:
typedef std::vector<unsigned>::const_iterator const_iterator;
typedef std::vector<unsigned>::const_iterator iterator;

BackTrack (unsigned nVariables, unsigned arity=2);
// Create a backtracking state for a problem with
// nVariables variables, each of which has the same
// number of possible values (arity).

template <class Iterator>
BackTrack (Iterator arityBegin,
Iterator arityEnd);
// Create a backtracking state in which each variable may have
// a different number of possible values. The values are obtained
// as integers stored in positions arityBegin .. arityEnd as per
// the usual conventions for C++ iterators. The number of
// variables in the system are inferred from the number of
// positions in the given range.

unsigned operator[] (unsigned variableNumber) const;
// Returns the current value associated with the indicated
// variable.

unsigned numberOfVariables() const;
// Returns the number of variables in the backtracking system.

unsigned arity (unsigned variableNumber) const;
// Returns the number of potential values that can be assigned
// to the indicated variable.

bool more() const;
// Indicates whether additional candidate solutions exist that
// can be reached by subsequent ++ or prune operaations.

void prune (unsigned level);
// Indicates that the combination of values associated with
// variables 0 .. level-1 (inclusive) has been judged unacceptable
// (regardless of the values that could be given to variables
// level..numberOfVariables()-1. The backtracking state will advance
// to the next solution in which at least one of the values in the
// variables 0..level-1 will have changed.

BackTrack& operator++();
// Indicates that the combination of values associated with
// variables 0 .. nVariables-1 (inclusive) has been judged unacceptable.
// The backtracking state will advance
// to the next solution in which at least one of the values in the
// variables 0..level-1 will have changed.

BackTrack operator++(int);
// Same as other operator++, but returns a copy of the old backtrack state


// Iterator operations for easy access to the currently assigned values
const_iterator begin() const {return values.begin();}
iterator begin() {return values.begin();}

const_iterator end() const {return values.end();}
iterator end() {return values.end();}

private:
bool done;
std::vector<unsigned> arities;
std::vector<unsigned> values;

};
inline
unsigned BackTrack::operator[] (unsigned variableNumber) const
// Returns the current value associated with the indicated
// variable.
{
return values[variableNumber];
}

inline
unsigned BackTrack::numberOfVariables() const
// Returns the number of variables in the backtracking system.
{
return values.size();
}

inline
unsigned BackTrack::arity (unsigned variableNumber) const
// Returns the number of potential values that can be assigned
// to the indicated variable.
{
return arities[variableNumber];
}


inline
bool BackTrack::more() const
// Indicates whether additional candidate solutions exist that
// can be reached by subsequent ++ or prune operaations.
{
return !done;
}

template <class Iterator>
BackTrack::BackTrack (Iterator arityBegin,
Iterator arityEnd):
// Create a backtracking state in which each variable may have
// a different number of possible values. The values are obtained
// as integers stored in positions arityBegin .. arityEnd as per
// the usual conventions for C++ iterators. The number of
// variables in the system are inferred from the number of
// positions in the given range.
arities(arityBegin, arityEnd), done(false)
{
fill_n (back_inserter(values), arities.size(), 0);
}


#endif

最佳答案

这是一个简单的伪代码,可以帮助您理解递归和回溯:

solve(game):
if (game board is full)
return SUCCESS
else
next_square = getNextEmptySquare()
for each value that can legally be put in next_square
put value in next_square (i.e. modify game state)
if (solve(game)) return SUCCESS
remove value from next_square (i.e. backtrack to a previous state)
return FAILURE

一旦您理解了这一点,接下来就是了解 getNextEmptySquare() 的各种实现如何通过以不同方式修剪状态空间图来影响性能。

我在你的原始伪代码中没有看到任何递归或有条不紊的搜索,虽然它并不完全清楚,它似乎只是一遍又一遍地尝试随机排列?

关于c++ - 从理论上使用回溯递归解决数独难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18168503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com