#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<windows.h>
#include<time.h>
using namespace std;
const int INF = 100001;
int map[9][9];
bool isPlace(int count) {
int row = count / 9;
int col = count % 9;
int j;
//同一行
for (j = 0; j < 9; ++j) {
if (map[row][j] == map[row][col] && j != col) {
return false;
}
}
//同一列
for (j = 0; j < 9; ++j) {
if (map[j][col] == map[row][col] && j != row) {
return false;
}
}
//同一小格
int tempRow = row / 3 * 3;
int tempCol = col / 3 * 3;
for (j = tempRow; j < tempRow + 3; ++j) {
for (int k = tempCol; k < tempCol + 3; ++k) {
if (map[j][k] == map[row][col] && j != row && k != col) {
return false;
}
}
}
return true;
}
void backtrace(int count) {
if (count == 81) {
HANDLE h;
int i;
h = GetStdHandle(STD_OUTPUT_HANDLE);
cout << "结果:" << endl;
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
SetConsoleTextAttribute(h, j + 7);
cout << map[i][j] << " ";
if ((j + 1) % 3 == 0)cout << " ";
}
if ((i + 1) % 3 == 0)
{
cout << endl;
}
cout << endl;
}
return;
}
int row = count / 9;
int col = count % 9;
if (map[row][col] == 0) {
for (int i = 1; i <= 9; ++i) {
map[row][col] = i;//赋值
if (isPlace(count)) {//可以放
backtrace(count + 1);//进入下一层
}
}
map[row][col] = 0;//回溯
}
else {
backtrace(count + 1);
}
}
int main()
{
int n;
while (cin >> n) {
while (n--) {
time_t start, end;
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> map[i][j];
}
}
start = clock();
backtrace(0);
end = clock();
cout << (double)(end - start) / CLOCKS_PER_SEC << endl;
}
}
system("pause");
return 0;
}
直接来个骨灰级数独测试一下程序:
好,就选择这个了,接下来运行一下程序,将空格用0代替输入:
得到答案花费总时间:5.092 s(可能系统不同会有所差别)
效果还可以,也可以用其它数据代进去测试一下。
(本代码写于2016年2月,可能会有一些历史遗留问题,欢迎指出)