我已经完成了大部分程序但是当我尝试使用部分填充的数据时应该有8个解决方案,它会打印出一个应该没有的解决方案。以下是我找到所有替代方案的功能:
void guess(Puzzle *puzzle, list<Puzzle> *solutions, stack<Puzzle> *alternatives)
{
int i, j, x;
while(!(*puzzle).isSolved(i, j))
{
for(x = 1; x <= 9; ++x)
{
if((*puzzle).checkCell(i, j, x))
{
(*puzzle).assign(i, j, x);
Puzzle alternative;
alternative.initialize(&(*puzzle));
if(solve(&alternative1))
{
(*solutions).push_back(alternative);
(*alternatives).push(*puzzle);
} // if
} // if
} // for
(*puzzle).initialize(&(*alternatives).top());
(*alternatives).pop();
} // while
} // guess
仅检查单元格(i,j)是否为空。函数isSolved()取(i,j)并将空单元格号i和j放入(i,j),以便在程序猜测时,它只猜测空单元格。
这是我的函数solve(),它解决了从guess()传入的每个给定的部分填充拼图的单个解决方案:
bool solve(Puzzle *alternative)
{
int i, j, x;
if((*alternative).isSolved(i, j))
return true;
for(x = 1; x <= 9; ++x)
{
if((*alternative).checkCell(i, j, x))
{
(*alternative).assign(i, j, x);
if(solve(alternative))
return true;
(*alternative).assign(i, j, 0);
} // if
} // for
return false;
} // solve()
以下是我尝试使用的部分填充数据: 0.8 ... ... 9743.5 ....... 8.1..1 8 .... 5 ...... 8.4 ...... 3 .... 6 ..... ..7..3.5 ... 8.9724 ... 5。
我的程序运行得很好,它提供了大多数谜题,除非它用于查找多个解决方案,然后它往往错过一个或两个解决方案。请帮忙!