数独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();
	} 
}
posted @ 2022-01-23 16:48  __iostream  阅读(51)  评论(0)    收藏  举报