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;
}