莫名其妙的 WA 了,求救~~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
template<int MS=1000> class DLX{
int idx,first[MS],siz[MS];//idx:指针 first:行首指示 siz:每列元素个数
int l[MS],r[MS],u[MS],d[MS];
int col[MS],row[MS];//col:行 row:列
void remove(int c)
{
int i,j;
l[r[c]]=l[c]; r[l[c]]=r[c];
for(i=d[c];i!=c;i=d[i])
for(j=r[i];j!=i;j=r[j])
{
u[d[j]]=u[j]; d[u[j]]=d[j];
--siz[col[j]];
}
}
void recover(int c)
{
int i,j;
l[r[c]]=r[l[c]]=c;
for(i=u[c];i!=c;i=u[i])
for(j=l[i];j!=i;j=l[j])
{
u[d[j]]=d[u[j]]=j;
++siz[col[j]];
}
}
public:
int ans,stk[MS];//记录答案
void build(int m)
{
int i;
for(i=0;i<=m;i++)
{
l[i]=i-1; r[i]=i+1;
u[i]=d[i]=i;
}
l[0]=m; r[m]=0; idx=m;
memset(first,0,sizeof(first));
memset(siz,0,sizeof(siz));
memset(col,0,sizeof(col));
memset(row,0,sizeof(row));
}
void insert(int rr,int c)
{
row[++idx]=rr; col[idx]=c; ++siz[c];
u[idx]=c; d[idx]=d[c]; u[d[c]]=idx; d[c]=idx;
if(first[rr]==0)
first[rr]=l[idx]=r[idx]=idx;
else
{
l[idx]=first[rr];
r[idx]=r[first[rr]];
l[r[first[rr]]]=idx;
r[first[rr]]=idx;
}
}
bool dance(int dep)
{
int i,j,c=r[0];
if(r[0]==0)//空矩阵
{
ans=dep;
return 1;
}
for(i=r[0];i!=0;i=r[i])
if(siz[i]<siz[c])
c=i;//查找元素最少的列
remove(c);
for(i=d[c];i!=c;i=d[i])
{
stk[dep]=row[i];//选择第i行
for(j=r[i];j!=i;j=r[j])
remove(col[j]);
if(dance(dep+1)) return 1;
for(j=l[i];j!=i;j=l[j])
recover(col[j]);
}
recover(c);
return 0;
}
};
DLX<4200000> a;
void Insert(int x,int y,int k)
{
int dx=(x-1)/4+1,dy=(y-1)/4+1;
int room=(dx-1)*4+dy;
int id=(x-1)*256+(y-1)*16+k;
a.insert(id,(x-1)*16+k);
a.insert(id,256+(y-1)*16+k);
a.insert(id,256*2+(room-1)*16+k);
a.insert(id,256*3+(x-1)*16+y);
}
int main()
{
int i,j,k;
int t;
int ans[20][20];
cin>>t;
while(t--)
{
getchar();
a.build(1024);
for(i=1;i<=16;i++)
{
for(j=1;j<=16;j++)
{
char c;
c=getchar();
if(c=='-')
ans[i][j]=0;
else
ans[i][j]=c-'A'+1;
for(k=1;k<=16;k++)
if(!ans[i][j]||ans[i][j]==k)
Insert(i,j,k);
}
getchar();
}
a.dance(1);
for(i=1;i<a.ans;i++)
{
int x=(a.stk[i]-1)/16/16+1;
int y=(a.stk[i]-1)/16%16+1;
int k=(a.stk[i]-1)%16+1;
ans[x][y]='A'+k-1;
}
for(i=1;i<=16;i++)
{
for(j=1;j<=16;j++)
putchar(ans[i][j]);
cout<<"\n";
}
cout<<"\n";
}
return 0;
}
/*
1
--A----C-----O-I
-J--A-B-P-CGF-H-
--D--F-I-E----P-
-G-EL-H----M-J--
----E----C--G---
-I--K-GA-B---E-J
D-GP--J-F----A--
-E---C-B--DP--O-
E--F-M--D--L-K-A
-C--------O-I-L-
H-P-C--F-A--B---
---G-OD---J----H
K---J----H-A-P-L
--B--P--E--K--A-
-H--B--K--FI-C--
--F---C--D--H-N-
*/