求助DLX死循环
查看原帖
求助DLX死循环
401052
Endline楼主2023/7/28 08:28

rt,进入 dance 函数之后就卡里面出不来了。。。

#include<bits/stdc++.h>
#define MAXN 10002
using namespace std;
int T,n,m,cnt;
int a[17][17];
int rid[MAXN],lcnt[MAXN];
int ans[MAXN];
struct DLXnode
{
    int l,r,d,u;
    int row,col;
}d[1000002];
inline void build()
{
    for(int i=0;i<=m;i++)
    {
        d[i].l=i-1,d[i].r=i+1;
        d[i].d=d[i].u=i;
    }
    d[0].l=m,d[m].r=0;
    cnt=m;
    return;
}
inline void addnode(int r,int c)
{
    d[++cnt].row=r,d[cnt].col=c;
    d[cnt].u=d[c].u;d[cnt].d=c;
    d[d[cnt].u].d=cnt;
    d[d[cnt].d].u=cnt;
    if(!rid[r])d[cnt].l=d[cnt].r=cnt;
    else
    {
        d[cnt].l=rid[r],d[cnt].r=d[rid[r]].r;
        d[d[cnt].l].r=cnt;
        d[d[cnt].r].l=cnt;
    }
    rid[r]=cnt;
    lcnt[c]++;
    return;
}
inline void remove(int c)
{
    for(int i=d[c].d;i!=c;i=d[i].d)
        for(int j=d[i].r;j!=i;j=d[j].r)
        {
            d[d[j].d].u=d[j].u;
            d[d[j].u].d=d[j].d;
            lcnt[d[j].col]--;
        }
    d[d[c].l].r=d[c].r;
    d[d[c].r].l=d[c].l;
    return;
}
inline void resume(int c)
{
    d[d[c].l].r=c;
    d[d[c].r].l=c;
    for(int i=d[c].d;i!=c;i=d[i].d)
        for(int j=d[i].r;j!=i;j=d[j].r)
        {
            d[d[j].d].u=j;
            d[d[j].u].d=j;
            lcnt[d[j].col]++;
        }
    return;
}
bool dance(int dep)
{
    if(d[0].r==0)
    {
        for(int i=1;i<=16;i++)
        {
            for(int j=1;j<=16;j++)
                printf("%c",a[i][j]-1+'A');
            puts("");
        }
        return true;
    }
    int c=d[0].r;
    for(int i=d[0].r;i;i=d[i].r)
        if(lcnt[i]<lcnt[c])c=i;
    remove(c);
    for(int i=d[c].d;i!=c;i=d[i].d)
    {
        int tp=d[i].row-1;
        int tr=tp/16/16+1,tc=tp/16%16+1,tk=tp%16+1;
        a[tr][tc]=tk;
        for(int j=d[i].r;j!=i;j=d[j].r)
            remove(d[j].col);
        if(dance(dep+1))return true;
        for(int j=d[i].r;j!=i;j=d[j].r)
            resume(d[j].col);
    }
    resume(c);
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--)
    {
        n=4096,m=1024;
        memset(lcnt,0,sizeof(lcnt));
        memset(rid,0,sizeof(rid));
        cnt=0;
        build();
        for(int i=1;i<=16;i++)
        {
            string str;
            cin>>str;
            for(int j=0;j<16;j++)
                if(str[j]!='-')a[i][j+1]=str[j]-'A'+1;
        }
        for(int i=1;i<=16;i++)
            for(int j=1;j<=16;j++)
                for(int k=1;k<=16;k++)
                {
                    if(a[i][j]&&k!=a[i][j])continue;
                    int r=((i-1)*16+(j-1))*16+k;
                    addnode(r,(i-1)*16+j);
                    addnode(r,256+(i-1)*16+k);
                    addnode(r,512+(j-1)*16+k);
                    addnode(r,768+(((i-1)/4)*4+(j-1)/4)*16+k);
                }
        dance(1);
    }
    return 0;
}
2023/7/28 08:28
加载中...