首页 > 代码库 > poj2676(Sudoku)

poj2676(Sudoku)

题目地址:Sudoku

 

题目大意:

    一个9*9的矩阵,让你往里面填写数字,以保证每行每列以及9*9分解的9个小3*3的矩阵里 数字1-9不重复。如果有多种情况,输出其中一种即可。

 

解题思路:

    暴搜DFS。正着搜600+ms 。倒着搜0ms。 数据的原因。因为少写了一句话,让我调试了一下午。

分析:

   我是用ce2标记该空是否能找到合适的数,如果找不到return到上一层,这时的ce2 还是为“1”(意思为该坐标内有值),没重新归零,这样以至于将1-9循环完之后进不去

if(!ce2)   。这样就没法return 到上一层。所以DFS之后应该将ce2归零。

 

正着搜代码:

  1 #include <algorithm>  2 #include <iostream>  3 #include <sstream>  4 #include <cstdlib>  5 #include <cstring>  6 #include <cstdio>  7 #include <string>  8 #include <bitset>  9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 #define PI 3.1415927 21 /***************************************/ 22 const int INF = 0x7f7f7f7f; 23 const double eps = 1e-8; 24 const double PIE=acos(-1.0); 25 const int d1x[]= {0,-1,0,1}; 26 const int d1y[]= {-1,0,1,0}; 27 const int d2x[]= {0,-1,0,1}; 28 const int d2y[]= {1,0,-1,0}; 29 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 30 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 31 const int dirx[]= {-1,1,-2,2,-2,2,-1,1}; 32 const int diry[]= {-2,-2,-1,-1,1,1,2,2}; 33 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/ 34 /***************************************/ 35 void openfile() 36 { 37     freopen("data.in","rb",stdin); 38     freopen("data.out","wb",stdout); 39 } 40 priority_queue<int> qi1; 41 priority_queue<int, vector<int>, greater<int> >qi2; 42 /**********************华丽丽的分割线,以上为模板部分*****************/ 43 char map1[10][10]; 44 int map[10][10]; 45 int vis1[10][10],vis2[10][10],vis3[10][10]; 46 int cnt; 47 int ce; 48 int ce1; 49 int DFS(int x,int y,int cnt) 50 { 51     int i,j,k,h1,h2; 52     if (cnt==81) 53     { 54         ce1=1; 55         return 0; 56     } 57     for(i=x;i<=9;i++) 58        for(j=y;j<=9;j++) 59        { 60            if (j==9) 61                y=1; 62            if (!map[i][j]) 63            { 64                int ce2=0; 65                for(k=1;k<=9;k++) 66                { 67                    if (vis1[i][k]||vis2[j][k]) 68                        continue; 69                    for(ce=0,h1=(i-1)/3*3+1;h1<=(i-1)/3*3+3;h1++) 70                    { 71                        for(h2=(j-1)/3*3+1;h2<=(j-1)/3*3+3;h2++) 72                            if (k==map[h1][h2]) 73                            { 74                                ce=1; 75                                break; 76                            } 77                         if (ce) 78                             break; 79                    } 80                    if (ce) 81                         continue; 82                     ce2=1; 83                     vis1[i][k]=1; 84                     vis2[j][k]=1; 85                     map[i][j]=k; 86                     DFS(i,j,cnt+1); 87                     if (ce1) 88                         return 0; 89                     vis1[i][k]=0; 90                     vis2[j][k]=0; 91                     map[i][j]=0; 92                     ce2=0; 93                } 94                if (!ce2) 95                    return 0; 96            } 97        } 98     return 0; 99 }100 int main()101 {102     int cas;103     scanf("%d",&cas);104     while(cas--)105     {106         int i,j;107         cnt=0;108         memset(map,0,sizeof(map));109         memset(map1,0,sizeof(map1));110         memset(vis1,0,sizeof(vis1));111         memset(vis2,0,sizeof(vis2));112         memset(vis3,0,sizeof(vis3));113         for(i=1;i<=9;i++)114         {115             getchar();116             for(j=1;j<=9;j++)117             {118                 scanf("%c",&map1[i][j]);119                 map[i][j]=map1[i][j]-0;120                 int cc=map[i][j];121                 if (map[i][j])122                 {123                     vis1[i][cc]=1;124                     vis2[j][cc]=1;125                      cnt++;126                 }127             }128         }129         ce1=0;130         DFS(1,1,cnt);131         for(i=1;i<=9;i++)132         {133             for(j=1;j<=9;j++)134                printf("%d",map[i][j]);135             printf("\n");136         }137     }138     return 0;139 }140 /*141 10142 103628000143 002139468144 980000231145 391500786146 468917352147 000863914148 237480000149 619000000150 854390000151 */
View Code

 

倒着搜代码:

  1 #include <algorithm>  2 #include <iostream>  3 #include <sstream>  4 #include <cstdlib>  5 #include <cstring>  6 #include <cstdio>  7 #include <string>  8 #include <bitset>  9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 #define PI 3.1415927 21 /***************************************/ 22 const int INF = 0x7f7f7f7f; 23 const double eps = 1e-8; 24 const double PIE=acos(-1.0); 25 const int d1x[]= {0,-1,0,1}; 26 const int d1y[]= {-1,0,1,0}; 27 const int d2x[]= {0,-1,0,1}; 28 const int d2y[]= {1,0,-1,0}; 29 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 30 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 31 const int dirx[]= {-1,1,-2,2,-2,2,-1,1}; 32 const int diry[]= {-2,-2,-1,-1,1,1,2,2}; 33 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/ 34 /***************************************/ 35 void openfile() 36 { 37     freopen("data.in","rb",stdin); 38     freopen("data.out","wb",stdout); 39 } 40 priority_queue<int> qi1; 41 priority_queue<int, vector<int>, greater<int> >qi2; 42 /**********************华丽丽的分割线,以上为模板部分*****************/ 43 char map1[10][10]; 44 int map[10][10]; 45 int vis1[10][10],vis2[10][10],vis3[10][10]; 46 int cnt; 47 int ce; 48 int ce1; 49 int DFS(int x,int y,int cnt) 50 { 51     int i,j,k,h1,h2; 52     if (cnt==81) 53     { 54         ce1=1; 55         return 0; 56     } 57     for(i=x;i>=1;i--) 58        for(j=y;j>=1;j--) 59        { 60            if (j==1) 61                y=9; 62            if (!map[i][j]) 63            { 64                int ce2=0; 65                for(k=1;k<=9;k++) 66                { 67                    if (vis1[i][k]||vis2[j][k]) 68                        continue; 69                    for(ce=0,h1=(i-1)/3*3+1;h1<=(i-1)/3*3+3;h1++) 70                    { 71                        for(h2=(j-1)/3*3+1;h2<=(j-1)/3*3+3;h2++) 72                            if (k==map[h1][h2]) 73                            { 74                                ce=1; 75                                break; 76                            } 77                         if (ce) 78                             break; 79                    } 80                    if (ce) 81                         continue; 82                     ce2=1; 83                     vis1[i][k]=1; 84                     vis2[j][k]=1; 85                     map[i][j]=k; 86                     DFS(i,j,cnt+1); 87                     if (ce1) 88                         return 0; 89                     vis1[i][k]=0; 90                     vis2[j][k]=0; 91                     map[i][j]=0; 92                     ce2=0;  //因为没加这一句话调了一下午,现在终于吸取教训了!!! 93                } 94                if (!ce2) 95                    return 0; 96            } 97        } 98     return 0; 99 }100 int main()101 {102     int cas;103     scanf("%d",&cas);104     while(cas--)105     {106         int i,j;107         cnt=0;108         memset(map,0,sizeof(map));109         memset(map1,0,sizeof(map1));110         memset(vis1,0,sizeof(vis1));111         memset(vis2,0,sizeof(vis2));112         memset(vis3,0,sizeof(vis3));113         for(i=1;i<=9;i++)114         {115             getchar();116             for(j=1;j<=9;j++)117             {118                 scanf("%c",&map1[i][j]);119                 map[i][j]=map1[i][j]-0;120                 int cc=map[i][j];121                 if (map[i][j])122                 {123                     vis1[i][cc]=1;124                     vis2[j][cc]=1;125                      cnt++;126                 }127             }128         }129         ce1=0;130         DFS(9,9,cnt);131         for(i=1;i<=9;i++)132         {133             for(j=1;j<=9;j++)134                printf("%d",map[i][j]);135             printf("\n");136         }137     }138     return 0;139 }140 /*141 10142 103628000143 002139468144 980000231145 391500786146 468917352147 000863914148 237480000149 619000000150 854390000151 */
View Code