//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef __int64 LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const LL mod=9999991;
const int NN=10000010;
const int MM=2000010;
/* ****************** */
const int BIG1=4;
const int BIG=BIG1*BIG1;
const int BIG2=BIG*BIG;
const int maxnode = BIG*BIG*BIG*4 + BIG*BIG*4 + 1 ;
const int maxn=BIG*BIG*4;
const int maxr=BIG*BIG*BIG;
int sz,ansd,ans[maxr];
int S[maxn+1],H[maxr+1];
int row[maxnode],col[maxnode];
int U[maxnode],D[maxnode],L[maxnode],R[maxnode];
char mat[BIG+5][BIG+5];
void dl_init(int n)
{
memset(H,-1,sizeof(H));
int i;
for(i=0;i<=n;i++)
{
S[i]=0;
U[i]=D[i]=i;
L[i]=i-1;
R[i]=i+1;
}
L[0]=n;
R[n]=0;
sz=n+1;
}
void dl_add(int r,int c)
{
row[sz]=r,col[sz]=c;
S[c]++;
U[sz]=U[c];
D[sz]=c;
D[U[c]]=sz;
U[c]=sz;
if(H[r]==-1)
L[sz]=R[sz]=H[r]=sz;
else
{
L[sz]=L[H[r]];
R[sz]=H[r];
R[L[sz]]=sz;
L[H[r]]=sz;
}
sz++;
}
void remove(int c)
{
int i,j;
R[L[c]]=R[c];
L[R[c]]=L[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];
S[col[j]]--;
}
}
void restore(int c)
{
int i,j;
for(i=U[c];i!=c;i=U[i])
for(j=L[i];j!=i;j=L[j])
{
S[col[j]]++;
U[D[j]]=j;
D[U[j]]=j;
}
L[R[c]]=c;
R[L[c]]=c;
}
bool dl_dfs(int d)
{
if(R[0]==0)
{
ansd=d;
return true;
}
int i,j,c=R[0];
bool fg=false;
for(i=R[0];i!=0;i=R[i])
if(S[i]<S[c])
c=i;
remove(c);
for(i=D[c];i!=c;i=D[i])
{
ans[d]=row[i];
for(j=R[i];j!=i;j=R[j])
remove(col[j]);
fg=dl_dfs(d+1);
for(j=L[i];j!=i;j=L[j])
restore(col[j]);
if(fg)
break;
}
restore(c);
return fg;
}
int encode(int a,int b,int c)
{
return a*BIG2+b*BIG+c+1;
}
void decode(int x,int &r,int &c,int &k)
{
x--;
k=x%BIG,x/=BIG;
c=x%BIG,x/=BIG;
r=x;
}
void add(int r,int c,int k)
{
int rr=encode(r,c,k);
dl_add( rr, encode(0,r,c) );
dl_add( rr, encode(1,r,k) );
dl_add( rr, encode(2,c,k) );
dl_add( rr, encode(3, (r/BIG1)*BIG1+c/BIG1, k) );
}
int main()
{
int i,j,k,ii;
bool f=false;
while(scanf("%s",mat[0])!=EOF)
{
if(f)puts("");
for(i=1;i<BIG;i++)scanf("%s",mat[i]);
dl_init(BIG*BIG*4);
for(i=0;i<BIG;i++)
for(j=0;j<BIG;j++)
{
if(mat[i][j]=='-')
{
for(k=0;k<BIG;k++)
add(i,j,k);
}
else
add(i,j,mat[i][j]-'A');
}
dl_dfs(0);
for(ii=0;ii<ansd;ii++)
{
decode(ans[ii],i,j,k);
mat[i][j]='A'+k;
}
for(i=0;i<BIG;i++)
{
for(j=0;j<BIG;j++)
printf("%c",mat[i][j]);
puts("");
}
f=true;
}
return 0;
}
POJ 3076 Sudoku 数独模板
最新推荐文章于 2018-08-22 20:10:17 发布