Problem J. Let Sudoku Rotate HDU - 6341

http://acm.hdu.edu.cn/showproblem.php?pid=6341

搜索题。。

可行性剪枝结合最优解剪枝 说着简单 比赛都没敢往搜索想 直接跳了。。

#include <bits/stdc++.h>
using namespace std;

int mp[300];
int ans;
char ch[20][20];

void init()
{
	int i,j;
	for(i=0;i<10;i++) mp['0'+i]=i;
	for(i=0;i<6;i++) mp['A'+i]=10+i;
}

//sythahaha

void rotate(int x,int y)
{
	char tmp[20][20];
	int i,j,ii,jj;
	for(i=4*x,jj=4*y+4-1;i<4*x+4;i++,jj--)
	{
		for(j=4*y,ii=4*x;j<4*y+4;j++,ii++)
		{
			tmp[ii][jj]=ch[i][j];
		}
	}
	for(i=4*x;i<4*x+4;i++)
	{
		for(j=4*y;j<4*y+4;j++)
		{
			ch[i][j]=tmp[i][j];
		}
	}
}

bool judge(int x,int y)
{
	bool book[20];
	int i,j;
	for(i=4*x;i<4*x+4;i++)
	{
		memset(book,false,sizeof(book));
		for(j=0;j<4*y+4;j++)
		{
			if(book[mp[ch[i][j]]]) return false;
			book[mp[ch[i][j]]]=true;
		}
	}
	for(j=4*y;j<4*y+4;j++)
	{
		memset(book,false,sizeof(book));
		for(i=0;i<4*x+4;i++)
		{
			if(book[mp[ch[i][j]]]) return false;
			book[mp[ch[i][j]]]=true;
		}
	}
	return true;
}

void dfs(int x,int y,int cnt)
{
	int i;
    if(cnt>=ans) return;
    if(x==4&&y==0)
	{
        ans=min(ans,cnt);
        return;
    }
    for(i=0;i<4;i++)
	{
        if(judge(x,y))
        {
			if(y<3) dfs(x,y+1,cnt+i);
			else dfs(x+1,0,cnt+i);
		}
        rotate(x,y);
    }
}

int main()
{
	int t,i,j;
	init();
	scanf("%d",&t);
	while(t--)
	{
		for(i=0;i<16;i++)
		{
			scanf("%s",ch[i]);
		}
		ans=100;
		dfs(0,0,0);
		printf("%d\n",ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/81369971