数读9*9 个人训练赛/ G/F ——POJ - 3074 (DLK)


本来以为跟之前的做的一个4*4一样的一个题目,用普通的dfs去解决,但是开始dfs会输出各个答案,在加入flag之后使他停止在输出一组上,但是还是超时

超时代码

#include 
#include
using namespace std;
int vis[15][15];
char tu[15][15];
int ju(int r,int l)
{
    for(int i=0;i<9;i++)
    {
        if(tu[i][l]==tu[r][l]&&i!=r)
            return 0;
    }
    for(int i=0;i<9;i++)
    {
        if(tu[r][i]==tu[r][l]&&i!=l)
            return 0;
    }
    int mr=r;
    int ml=l;
    while(mr%3!=0)
        mr--;
    while(ml%3!=0)
        ml--;
    for(int i=mr;i<=mr+2;i++)
    {
        for(int j=ml;j>tu[i][j];
             if(tu[i][j]=='d')
                {
                flagg=1;break;
                }
        }
        if(flagg)
            break;
      }
       if(flagg)
            break;
        flag=0;
      dfs(0);
    }
   // cout << "Hello world!" << endl;
    return 0;
}
搜了一下题解之后发现是一种dance links 的一种算法

点击打开链接

这个超好的 博客将DLX的!点击打开链接

这里引用一个题解


#include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
      
    using namespace std;  
    //   列:(行+列+块)*9种可能+9*9个格子  
    //   行: 9*9*9  表示第i行第j列填k  
    const int MAXN=(9+9+9)*9+9*9+9*9*9*9*9*4+10;  
    #define INF 0xFFFFFF  
    int size;  
    int head,sz;  
    int U[MAXN],D[MAXN],L[MAXN],R[MAXN];  
    int H[MAXN],ROW[MAXN],C[MAXN],S[MAXN],O[MAXN];  
      
    void remove(int c)  
    {  
        L[R[c]]=L[c];  
        R[L[c]]=R[c];  
        for(int i=D[c];i!=c;i=D[i])  
        {  
            for(int j=R[i];j!=i;j=R[j])  
            {  
                U[D[j]]=U[j];  
                D[U[j]]=D[j];  
                --S[C[j]];  
            }  
         }  
    }  
      
    void resume(int c)  
    {  
        for(int i=U[c];i!=c;i=U[i])  
        {  
            for(int j=L[i];j!=i;j=L[j])  
            {  
                ++S[C[j]];  
                U[D[j]]=j;  
                D[U[j]]=j;  
              }  
         }  
         L[R[c]]=c;  
         R[L[c]]=c;  
    }  
      
    bool dfs(int k)  
    {  
        if(R[head]==head)  
        {  
            sort(O,O+9*9);  
            int p=0;  
            for(int i=0;i<9;i++)  
            {  
                for(int j=0;j<9;j++)  
                {  
                    int num=O[p++];  
                    //cout<



你可能感兴趣的:(待补题,poj,vj,搜索)