回溯法解数独

我记得有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 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9623991.html