数独2
挖坑
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <cmath>
#include <vector>
using namespace std;
const int N=17;
const int INF=0x3f3f3f3f;
int row[N],col[N],squ[N];
char mp[N][N];
int t1,t2,t3;
int pos(int x,int y)
{
return 4*(x/4+(x%4!=0))-4+y/4+(y%4!=0);
}
vector<int> p[260];
void clean()
{
for(int i=1;i<=16;i++) row[i]=col[i]=squ[i]=255;
memset(mp,0,sizeof mp);
}
void print();
{
for(int i=1;i<=16;i++)
{
for(int j=1;j<=16;j++)
putchar(mp[i][j]);
putchar('\n');
}
}
bool find(int &x,int &y)
{
int tmp=INF;
for(int i=1;i<N;i++)
for(int j=1;j<N;j++)
{
int t=row[i]&col[j]&squ[pos(i,j)];
if(!t) return false;
if(tmp>p[t].size())
{
tmp=p[t].size();
x=i; y=j;
}
}
}
void dfs(int dep)
{
if(dep==256){ print(); goto LOOP;}
int tx,ty;
if(!find(tx,ty)) return;
int r[17]={0},c[17]={0},s[17]={0};
for(int k=0;k<16;k++)
{
int x=1<<k;
for(int i=1;i<=16;i++)
for(int j=1;j<=16;j++)
{
if(row[i]&x) r[i]|=x;
if(col[j]&x) c[j]|=x;
if(squ[pos(i,j)]&x) squ[pos(i,j)]|=x;
}
s
}
for(int i=1;i<=16;i++) if(r[i]!=255||c[i]!=255||s[i]!=255) return;
for(int t=row[tx]&col[ty]&squ[pos(tx,ty)];t;t-=t&(-t))
{
int x=t&-x;
int t1=row[tx],t2=col[ty],t3=squ[pos(tx,ty)];
row[tx]^=x; col[ty]^=x; squ[pos(tx,ty)]^=x;
dfs(dep+1);
row[tx]=t1; col[ty]=t2; squ[pos(tx,ty)]=t3;
}
}
int main()
{
for(int i=1;i<=256;i++)
for(int j=0;j<=8;j++)
if((i>>j)&1)
p[i].push_back(j);
LOOP:
clean();
for(int i=1;i<N;i++)
{
for(int j=1;j<N;j++)
{
mp[i][j]=getchar(); int x=mp[i][j]-'A';
row[i]^=1<<x; col[j]^=1<<x; squ[pos(i,j)]^=1<<x;
}
getchar();
}
}

浙公网安备 33010602011771号