我记得有DLX精准覆盖算法,然后应用舞蹈链数据结构来解决这个问题来着
但是这里就直接贴一个裸的回溯的了
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 int a[9][9]; 5 inline bool check(int x,int y,int e){ 6 for(int i=0;i<=8;i++) 7 if(a[x][i]==e&&i!=y)return 0; 8 for(int i=0;i<=8;i++) 9 if(a[i][y]==e&&i!=x) 10 return 0; 11 for(int i=x/3*3;i<x/3*3+3;i++) 12 for(int j=y/3*3;j<y/3*3+3;j++) 13 if(a[i][j]==e&&i!=x&&j!=y) 14 return 0; 15 return 1; 16 } 17 void dfs(int z) 18 { 19 if(z==81) 20 { 21 for(int i=0;i<=8;i++) 22 { 23 for(int j=0;j<=8;j++) 24 cout<<a[i][j]<<" "; 25 cout<<endl; 26 } 27 exit(0); 28 } 29 int x=z/9; 30 int y=z%9; 31 if(a[x][y]) 32 dfs(z+1); 33 else 34 { 35 for(int i=1;i<=9;i++) 36 if(check(x,y,i)) 37 a[x][y]=i,dfs(z+1); 38 a[x][y]=0; 39 } 40 } 41 int main() 42 { 43 for(int i=0;i<=8;i++) 44 for(int j=0;j<=8;j++) 45 cin>>a[i][j]; 46 dfs(0); 47 return 0; 48 }