不用调试器实在是搞不定啊。。。。 递归,永远的神。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N=9;
vector<vector<int>> sudoku(9,vector<int>(9,0));
struct point{
int x;
int y;
};
vector<int> judge(point p){
vector<int>vec;
vector<int>heng = sudoku[p.x];
vector<int>shu;
for(int i =0 ;i<9;i++)
{
shu.push_back(sudoku[i][p.y]);
}
vector <int> nine;
int qidian=p.x/3;
int yqidian = p.y/3;
for(int i = qidian*3;i<qidian*3+3;i++)
for(int j = yqidian*3;j<yqidian*3+3;j++){
nine.push_back(sudoku[i][j]);
}
heng.insert(heng.end(),shu.begin(),shu.end());
heng.insert(heng.end(),nine.begin(),nine.end());
for(int i = 1 ;i<=9;i++)
{
if(find(heng.begin(),heng.end(),i)==heng.end())
vec.push_back(i);
}
return vec;
}
bool solve(point p,vector<point>&vec,int index){
bool flag = false;
if(index>=vec.size())
return true;
p=vec[index];
vector<int> possible= judge(p);
if(possible.size()>0){
for(int i =0 ;i<possible.size();i++){
sudoku[p.x][p.y]=possible[i];
flag = solve(vec[index],vec,index+1);
if( flag==false)
sudoku[p.x][p.y]=0;
else
break;
}
}
else
return false;
return flag;
}
int main()
{
vector<point> vec;
for(int i =0;i<N;i++)
for(int j =0;j<N;j++)
{
cin>>sudoku[i][j];
if(sudoku[i][j]==0)
vec.push_back({i,j});
}
point p = vec[1];
judge(p);
solve(p,vec,0);
for(int i =0 ;i< N;i++)
{ for(int j =0 ;j<N;j++)
cout<<sudoku[i][j]<<" ";
cout<<endl;}
return 0;
}