写一个自动求解数独的程序,回溯法。递归调用的时候提前终止了
代码如下:
#include<iostream>
#include<fstream>
using namespace std;
//数独
struct SuDoku {
char question[9][9]; //储存原始数独题
char key[9][9];
};
struct Point {
int x;
int y;
};
class Finsudoku {
public:
Finsudoku(int flags); //构造,从文件中获取数独题,需要填的空用0表示
void GetSudoku_enter();
void Print() ;
char GetAnswer(Point point, char str);
bool Iskey(int row, int col, char str); //判断某一位置为某一值是否可行
void Findvalue(int row,int col); //求解
private:
SuDoku sudoku;
};
bool Finsudoku::Iskey(int row, int col, char str) {
int m = row / 3;
int n = col / 3;
for (int i = 0; i < 9; i++) {
if (sudoku.question[i][col] == str )return false;
if (sudoku.question[row][i] == str)return false;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (sudoku.question[m * 3 + i][n * 3 + j] == str)return false;
}
}
return true;
}
//递归求解
void Finsudoku::Findvalue(int row = 0, int col = 0)
{
//cout << "row " << row << " " << "col " << col << endl; 测试用
if (col == 9 && row == 8) {
//cout << "满" << endl;
Print();
return ; }
if (col == 9) { col = 0, row++; }
if (sudoku.question[row][col] == '0') {
for (int i = 1; i <= 9; i++) {
char temp = i + '0';
if (Iskey(row, col, temp)) {
sudoku.question[row][col] = temp;
Findvalue(row, col + 1);
}
else sudoku.question[row][col] = '0';
}
}else Findvalue(row, col+1);
}
#include<iostream>
#include<fstream>
#include"sudoku.h"
using namespace std;
int main()
{
Finsudoku test1(1);
test1.Print();
test1.Findvalue();
test1.Print();
}
求大佬帮忙解惑
递归调用停止一般是传递的参数不正确,或者程序符号递归停止条件
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
也许对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y