数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
思路
参考了答案解析
从三个方面来判断缺失位置的数字,分别是缺失位置对应的行,缺失位置对应的列和缺失位置对应的块;
缺失位置的数值从1到9,一个一个地尝试
#include<bits/stdc++.h>
using namespace std;
bool contain(vector<int>& vec, int k) {
int size = vec.size();
for (int i = 0; i < size; ++i)
if (vec[i] == k)
return true;
return false;
}
bool dfs(vector<vector<int> >& matrix, vector<vector<int> >& row, vector<vector<int> >& col, vector<vector<int> >& squ, int index) {
if (index == 81) return true;
int i = index / 9;
int j = index % 9;
if (matrix[i][j])
return dfs(matrix, row, col, squ, index + 1);
else {
for (int k = 1; k <= 9; ++k) {
if (!contain(row[i], k) && !contain(col[j], k) && !contain(squ[i / 3 * 3 + j / 3], k)) {
matrix[i][j] = k;
row[i].push_back(k);
col[j].push_back(k);
squ[i / 3 * 3 + j / 3].push_back(k);
if (dfs(matrix, row, col, squ, index + 1))
return true;
matrix[i][j] = 0;
row[i].erase(row[i].begin() + row[i].size() - 1);
col[j].erase(col[j].begin() + col[j].size() - 1);
squ[i / 3 * 3 + j / 3].erase(squ[i / 3 * 3 + j / 3].begin() + squ[i / 3 * 3 + j / 3].size() - 1);
}
}
return false;
}
}
int main() {
vector<vector<int> > matrix(9, vector<int>(9, 0));
vector<vector<int> > row(9);
vector<vector<int> > col(9);
vector<vector<int> > squ(9);
char ch;
for (int i = 0, j = 0; i < 9; ) {
cin >> ch;
if (ch == '}') {
++i, j = 0;
continue;
}
if (isdigit(ch)) {
int num = int(ch - '0');
matrix[i][j] = num;
if (num) {
row[i].push_back(num);
col[j].push_back(num);
squ[i / 3 * 3 + j / 3].push_back(num);
}
j++;
}
}
dfs(matrix, row, col, squ, 0);
for (int i = 0; i < 9; ++i) {
cout << "{";
for (int j = 0; j < 9; ++j) {
if (j != 8)
cout << matrix[i][j] << ",";
else
cout << matrix[i][j];
}
cout << "}" << endl;
}
return 0;
}