#include <stdio.h>
#include <conio.h>
#define MAX 9
class Sudoku
{
private:
char sudoku[MAX][MAX]; //一个数独题
long count; //解的个数
public:
Sudoku();
Sudoku(char sudoku[][MAX]);
void ShowResult();
void Solving(int line, int row);
bool IsOk(int line, int row, int n);
long GetCount();
};
long Sudoku::GetCount()
{
printf("=================郁闷的分割符===============/n");
printf("共有%d个解/n", this->count);
return this->count;
}
Sudoku::Sudoku(char sudoku[][MAX])
{
for (int i = 0; i < MAX; ++i)
{
for (int j = 0; j < MAX; ++j)
{
this->sudoku[i][j] = sudoku[i][j];
}
}
this->count = 0;
}
Sudoku::Sudoku()
{
for (int i = 0; i < MAX; ++i)
{
for (int j = 0; j < MAX; ++j)
{
this->sudoku[i][j] = 0;
}
}
this->count = 0;
}
void Sudoku::ShowResult()
{
int i, j;
for (i = 0; i < MAX; ++i)
{
for (j = 0; j < MAX; ++j)
{
printf("%2d", (int)this->sudoku[i][j]);
if ((j + 1) % 3 == 0)
{
printf("%2c", '|');
}
}
if ((i + 1) % 3 == 0)
{
printf("%s", "/n--------------------------");
}
printf("/n");
}
printf("/n");
}
bool Sudoku::IsOk(int line, int row, int n)
{
for (int i = 0; i < MAX; ++i)
{
if (n == this->sudoku[line][i] ||
n == this->sudoku[i][row])
{
return false;
}
}
for (i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
if (n == this->sudoku[3 * (line / 3) + i][3 * (row / 3) + j])
{
return false;
}
}
}
return true;
}
void Sudoku::Solving(int line, int row)
{
if (row > MAX - 1)
{
this->Solving(line + 1, 0);
}
if (line > MAX - 1)
{
this->ShowResult();
this->count++;
//getch(); //这里加下暂停
return;
}
if (0 == this->sudoku[line][row])
{
for (int n = 1; n <= 9; ++n)
{
if (IsOk(line, row, n))
{
this->sudoku[line][row] = n;
this->Solving(line, row + 1);
this->sudoku[line][row] = 0;
}
}
}
else
{
this->Solving(line, row + 1);
}
}
int main(int argc, char* argv[])
{
char s1[][MAX] = {
0, 0, 3, 0, 0, 2, 0, 4, 1,
4, 0, 1, 9, 0, 0, 0, 2, 6,
0, 0, 0, 4, 0, 0, 9, 0, 0,
0, 3, 0, 0, 0, 0, 5, 1, 8,
0, 5, 9, 0, 0, 0, 2, 6, 0,
2, 1, 4, 0, 0, 0, 0, 9, 0,
0, 0, 7, 0, 0, 8, 0, 0, 0,
1, 8, 0, 0, 0, 9, 4, 0, 7,
9, 6, 0, 7, 0, 0, 1, 0, 0
};
char s2[][MAX] = {
6,0,0,1,3,0,0,0,0,
8,0,0,0,0,0,0,6,0,
0,0,7,0,5,0,3,0,0,
3,0,0,0,0,0,0,0,0,
5,1,6,0,9,0,2,7,4,
0,0,0,0,0,0,0,0,5,
0,0,9,0,1,0,8,0,0,
0,2,0,0,0,0,0,0,3,
0,0,0,0,2,9,0,0,1
};
char s3[][MAX] = {
3,4,0,0,0,2,0,7,5,
0,5,0,0,0,0,0,4,0,
0,0,0,8,0,0,2,0,0,
0,0,0,6,0,0,0,9,4,
0,0,0,2,0,9,0,0,0,
4,9,0,0,0,8,0,0,0,
0,0,9,0,0,7,0,0,0,
0,3,0,0,0,0,0,5,0,
2,7,0,9,0,0,0,1,3
};
Sudoku sudoku(s3);
sudoku.Solving(0, 0);
sudoku.GetCount();
return 0;
}
数独游戏求解(递归+回溯)
最新推荐文章于 2020-03-01 19:55:19 发布
这是一个用C++编写的数独游戏求解器,利用递归和回溯策略来寻找所有可能的解。类`Sudoku`包含解数统计、显示结果、检查单元格是否合法以及进行解法搜索等功能。代码中提供了三个不同难度的数独题目供求解。
摘要由CSDN通过智能技术生成