这个题做了好几遍才写对……汗……太渣了。
首先弄懂数独的规则:九个宫不能重复,同一行不能重复,同一列不能重复。
这道题我的方法是回溯。
递归传入的是整个矩阵,还有当前位置坐标i,j。然后1~9一个个试。填入这个位置之后就按照扫描顺序填下一个位置。
#include <iostream>
#include <vector>
using namespace std;
bool isok(vector<vector<int> >& v, int i, int j, int k){
int m = (i / 3) * 3;
int n = (j / 3) * 3;
for(int x = m; x < m + 3; ++x)
{
for(int y = n; y < n + 3; ++y){
if(x == i && y == j) continue;
if( v[x][y] == k)
return false;
}
}
for(int x = 0; x < 9; ++x)
{
if(x == j) continue;
if(v[i][x] == k) return false;
}
for(int y = 0; y < 9; ++y)
{
if(y == i) continue;
if(v[y][j] == k) return false;
}
return true;
}
bool helper(vector<vector<int> >& v, int i, int j){
if(i < 0 || i >= 9 || j < 0 || j >= 9)
return true;
if(v[i][j] == 0){
for(int k = 1; k <= 9; ++k){
if(isok(v, i, j, k))
{
v[i][j] = k;
int inext = i;
int jnext = j + 1;
if(jnext == 9){
inext++;
jnext = 0;
}
if(helper(v, inext, jnext))
return true;
else
{
v[i][j] = 0;
}
}
}
}
else{
int inext = i;
int jnext = j + 1;
if(jnext == 9){
jnext = 0;
inext++;
}
if(helper(v, inext, jnext))
return true;
else return false;
}
return false;
}
int main()
{
vector<vector<int> > v(9, vector<int>(9, 0));
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
cin >> v[i][j];
}
}
if(helper(v, 0, 0))
{
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
cout << v[i][j];
if(j < 8) cout << " ";
}
cout << endl;
}
}
}