仅供娱乐,见笑:
#include <QCoreApplication>
#include <iostream>
#include <QList>
using namespace std;
int sudo[9][9] = {{0,0,0,3,4,0,1,0,0},
{8,0,0,0,0,0,0,5,0},
{5,0,3,0,0,6,7,0,0},
{0,0,0,0,6,0,3,9,0},
{0,3,2,0,9,0,0,0,0},
{7,0,0,0,0,0,0,0,1},
{0,4,0,8,0,0,0,6,7},
{0,7,0,0,5,1,0,0,0},
{0,0,8,0,0,0,0,0,4}
};
//打印数独
void DisplaySudo (int array[9][9]) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j)
cout << array[i][j] << ' ';
cout << endl;
}
}
//生成(i,j)位置上可能出现的数字集合
QList<int> checknum (int array[9][9], int i, int j) {
int iter;
int raw = (i/3)*3, col = (j/3)*3;
QList<int> list;
list << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9;
foreach (iter, list) {
// 行检查
for (int k = 0; k < 9; ++k) {
if (iter == array[i][k])
list.removeOne(iter);
}
// 列检查
for (int l = 0; l < 9; ++l) {
if (iter == array[l][j])
list.removeOne(iter);
}
// 九宫格检查
for (int m = 0; m < 3; ++m)
for (int n = 0; n < 3; ++n) {
if (iter == array[raw+m][col+n])
list.removeOne(iter);
}
}
return list;
}
void CalculateSudo (int array[9][9], int n) {
int temp[9][9];
int raw = n/9;
int col = n%9;
int iter;
for (int i = 0; i < 9; ++i)
for (int j = 0; j < 9; ++j)
temp[i][j] = array[i][j];
// 已有数据
if (array[raw][col] != 0) {
if (n == 80) {
cout << "The result is: " << endl;
DisplaySudo(temp);
}
else
CalculateSudo(temp, n+1);
}
// 第n个数为空
else {
QList<int> list = checknum(temp, raw, col); // 获取这个位置可能出现的数字集合
if (! list.isEmpty()) {
foreach (iter, list) {
temp[raw][col] = iter;
if (n == 80) {
cout << "The result is: " << endl;
DisplaySudo(temp);
}
else
CalculateSudo(temp, n+1);
}
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout << "Welcome to Sudoku!" << endl;
DisplaySudo(sudo);
cout << "Starting calculate..." << endl;
CalculateSudo(sudo, 0);
return a.exec();
}