求助剪枝
  • 板块UVA1309 Sudoku
  • 楼主w9095
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/11/5 14:41
  • 上次更新2023/11/5 16:13:06
查看原帖
求助剪枝
569235
w9095楼主2023/11/5 14:41

rt,感觉该用的都用了,样例本机跑了20s。

#include <bits/stdc++.h>
using namespace std;
int g[20][20]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4},
               {0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4},
               {0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4},
               {0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4},
               {0,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
               {0,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
               {0,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
               {0,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
               {0,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12},
               {0,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12},
               {0,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12},
               {0,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12},
               {0,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16},
               {0,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16},
               {0,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16},
               {0,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16}};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int s=0,flag=0,m[20],tx[20],ty[20];
char map1[20][20];
bitset<20>c[20][20],ck;
bool book[20][20];
void gq(int x,int y,int k)
{
	c[x][y][k]=1,book[x][y]=1;
	for(int i=0;i<4;i++)
	    {
	    	int tx=x+dx[i],ty=y+dy[i];
	    	if(g[tx][ty]!=g[x][y]||book[tx][ty])continue;
	    	gq(tx,ty,k);
		}
}

bool gj(int x,int y)
{
	bool res=0;
	if(map1[x][y]=='-')
	   {
	   for(int k=0;k<16;k++)
	       if(!c[x][y][k])m[k]++,tx[k]=x,ty[k]=y;
	   res=1;
       }
	ck&=c[x][y],book[x][y]=1;
	for(int i=0;i<4;i++)
	    {
	    	int tx=x+dx[i],ty=y+dy[i];
	    	if(g[tx][ty]!=g[x][y]||book[tx][ty])continue;
	    	res|=gj(tx,ty);
		}
	return res;
}

void fill(int i,int j,int id)
{
	memset(book,0,sizeof(book));
	for(int k=1;k<=16;k++)c[i][k][id]=1;
	for(int k=1;k<=16;k++)c[k][j][id]=1;
	gq(i,j,id);
}

void dfs(int now)
{
	int ch=0,px=0,py=0;
	char cop[20][20];
	bitset<20>coy[20][20];
	if(flag)return;
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        cop[i][j]=map1[i][j],coy[i][j]=c[i][j];
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        if(map1[i][j]=='-'&&c[i][j].count()==15)
	           {
	           for(int k=0;k<16;k++)
	           	    {
					  if(c[i][j][k])continue;
					  map1[i][j]='A'+k;
	                  fill(i,j,k);
					}
				now++;
			   }
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        if(map1[i][j]=='-'&&c[i][j].count()==16)
	            {
	            for(int i=1;i<=16;i++)
				    for(int j=1;j<=16;j++)
				        map1[i][j]=cop[i][j],c[i][j]=coy[i][j];
			    return;
			    }
    for(int i=1;i<=16;i++)
	    {
	    bool t=0;
	    ck.set();
	    for(int j=0;j<16;j++)m[j]=0,tx[j]=0,ty[j]=0;
	    for(int j=1;j<=16;j++)
	        if(map1[i][j]=='-')
	           {
	           for(int k=0;k<16;k++)
	               if(!c[i][j][k])m[k]++,tx[k]=i,ty[k]=j;
			   ck&=c[i][j],t=1;
		       }
		if(t&&ck.count()==16)
		   {
	       for(int i=1;i<=16;i++)
			   for(int j=1;j<=16;j++)
				   map1[i][j]=cop[i][j],c[i][j]=coy[i][j];
		   return;
		   }
		for(int j=0;j<16;j++)
		    if(m[j]==1)
		       {
		       	map1[tx[j]][ty[j]]='A'+j;
	            fill(tx[j],ty[j],j);
	            now++;
			   }
	    }
	for(int i=1;i<=16;i++)
	    {
	    bool t=0;
	    ck.set();
	    for(int j=0;j<16;j++)m[j]=0,tx[j]=0,ty[j]=0;
	    for(int j=1;j<=16;j++)
	        {
	        for(int k=0;k<16;k++)
	            if(!c[j][i][k])m[k]++,tx[k]=j,ty[k]=i;
	        if(map1[j][i]=='-')ck&=c[j][i],t=1;
	        }
		if(t&&ck.count()==16)
		   {
	       for(int i=1;i<=16;i++)
			   for(int j=1;j<=16;j++)
				   map1[i][j]=cop[i][j],c[i][j]=coy[i][j];
		   return;
		   }
		for(int j=0;j<16;j++)
		    if(m[j]==1)
		       {
		       	map1[tx[j]][ty[j]]='A'+j;
	            fill(tx[j],ty[j],j);
	            now++;
			   }
	    }
	memset(book,0,sizeof(book));
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        if(!book[i][j])
	           {
	           	ck.set();
	           	for(int j=0;j<16;j++)m[j]=0,tx[j]=0,ty[j]=0;
	           	bool t=gj(i,j);
		        if(t&&ck.count()==16)
		           {
			       for(int i=1;i<=16;i++)
					   for(int j=1;j<=16;j++)
						   map1[i][j]=cop[i][j],c[i][j]=coy[i][j];
				   return;
				   }
				for(int j=0;j<16;j++)
				    if(m[j]==1)
				       {
				       	map1[tx[j]][ty[j]]='A'+j;
			            fill(tx[j],ty[j],j);
			            now++;
					   }
			   }
	if(now==256)
	   {
	   	flag=1;
	   	for(int i=1;i<=16;i++)printf("%s\n",map1[i]+1);
	   	return;
	   }
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        if(map1[i][j]=='-'&&c[i][j].count()>ch)ch=c[i][j].count(),px=i,py=j;
	for(int i=1;i<=16;i++)
	    for(int j=1;j<=16;j++)
	        cop[i][j]=map1[i][j],coy[i][j]=c[i][j];
	for(int k=0;k<16;k++)
	    {
	    if(flag)return;
	    if(c[px][py][k])continue;
	    map1[px][py]='A'+k;
	    fill(px,py,k);
	    dfs(now+1);
	    for(int i=1;i<=16;i++)
		    for(int j=1;j<=16;j++)
		        map1[i][j]=cop[i][j],c[i][j]=coy[i][j];
		}
}

int main()
{
	while(scanf("%s",map1[1]+1)!=-1)
		{
			for(int i=1;i<=16;i++)
		        for(int j=1;j<=16;j++)c[i][j].reset();
			flag=0,s=0;
			for(int i=2;i<=16;i++)scanf("%s",map1[i]+1);
			for(int i=1;i<=16;i++)
			    for(int j=1;j<=16;j++)
			        if(map1[i][j]!='-')
			           {
			           	s++;
			           	fill(i,j,map1[i][j]-'A');
					   }
			dfs(s);
		}
}
2023/11/5 14:41
加载中...