萌新数独遇难题
查看原帖
萌新数独遇难题
239192
淸梣ling楼主2020/12/22 18:37

莫名其妙的 WAWA 了,求救~~

#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-
*/
2020/12/22 18:37
加载中...