C++ 43行unordered_set回溯法,100%通过
Sudoku-Java
http://www.nowcoder.com/questionTerminal/78a1a4ebe8a34c93aac006c44f6bf8a1
#include<iostream>
#include<unordered_set>
using namespace std;
bool flag=false;
void dfs(int vec[][9],int i=0,int j=0){
if(i==9){
flag=true;
return;
}
if(vec[i][j]==0){
unordered_set<int> st;
for(int m=0;m<9;m++){
st.insert(vec[i][m]);
st.insert(vec[m][j]);
}
for(int m=i/3*3;m<i/3*3+3;m++)
for(int n=j/3*3;n<j/3*3+3;n++)
st.insert(vec[m][n]);
for(int m=1;m<=9;m++){
if(!flag&&st.find(m)==st.end()){
vec[i][j]=m;
dfs(vec,i+j/8,(j+1)%9);
}
}
if(!flag){
vec[i][j]=0;
return;
}
}else dfs(vec,i+j/8,(j+1)%9);
}
int main(){
int vec[9][9]{};
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
cin>>vec[i][j];
dfs(vec);
for(int i=0;i<9;i++){
for(int j=0;j<8;j++) cout<<vec[i][j]<<" ";
cout<<vec[i][8]<<endl;
}
return 0;
}
