noip 2009 靶型数独(纯搜索)

noip 2009 靶型数独(纯搜索)

#include 
#include 
#include 
#include 
#include 
using namespace std;

int a[12][12];
int mapp[12][12];
int vis[5][12][12];
struct wa
{
	int x,y;
}ss[85];
struct wayy
{
	int pos,numz;
	bool operator < (const wayy &a) const{
		return numz<a.numz;
	}
}sx[12];

inline int findscore(int i,int j)
{
	int g;
	if(i==1||i==9||j==1||j==9) g=6;
	else if(i==2||i==8||j==2||j==8) g=7;
	else if(i==3||i==7||j==3||j==7) g=8;
	else if(i==4||i==6||j==4||j==6) g=9;
	else if(i==5&&j==5) g=10;
	return g;
}
inline int findscore2()
{
	int anss=0;
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			anss+=a[i][j]*findscore(i,j);
			if(a[i][j]==0) return -1;
		}
	}
	return anss;
}
inline int findwhere(int i,int j)
{
	int g;
		if(i<=3&&j<=3) g=1;
			else 
				if(i>3&&i<=6&&j<=3) g=4;
				else
					if(i>6&&j<=3) g=7;
					else 
						if(i<=3&&j>3&&j<=6) g=2;
						else
							if(i<=3&&j>6) g=3;
							else
								if(i>3&&i<=6&&j>3&&j<=6) g=5;
								else 
									if(i>3&&i<=6&&j>6) g=6;
									else 
										if(i>6&&j>3&&j<=6) g=8;
										else
											if(i>6&&j>6) g=9;
		return g;
}

inline void init()
{
	for(int i=1;i<=9;i++)
	{
		int tem=0;
		for(int j=1;j<=9;j++)
		{
			if(mapp[i][j]==0) tem++;
		}
		sx[i].numz =tem;
		sx[i].pos =i;	
	}
	sort(sx+1,sx+10);
	int temp=0;
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			temp++;
			ss[temp].x = sx[i].pos;
			ss[temp].y = j;
		}
	}
}
inline bool canput(int x,int y,int k,int i)
{
	if(vis[1][x][i]) return false;
	if(vis[2][y][i]) return false;
	if(vis[3][k][i]) return false;
	return true;
}

int ans=-1;
inline void dfs(int s)
{
	if(s==82){
		ans=max(ans,findscore2());	
		return;
	}
	int x=ss[s].x ;
	int y=ss[s].y ;	
	int k=findwhere(x,y);
	if(!a[x][y])
	{
		for(int i=1;i<=9;i++)
		{
			if(canput(x,y,k,i))
			{
				a[x][y]=i;
				vis[1][x][i]=1;
				vis[2][y][i]=1;
				vis[3][k][i]=1;
				dfs(s+1);
				a[x][y]=0;	
				vis[1][x][i]=0;
				vis[2][y][i]=0;
				vis[3][k][i]=0;
			}	
		}		
	}
	else dfs(s+1);
}

int main()
{
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++) {
			cin>>mapp[i][j];
			if(mapp[i][j]!=0)
			{
				a[i][j]=mapp[i][j];
				int k=findwhere(i,j);
				vis[1][i][mapp[i][j]]=1;
				vis[2][j][mapp[i][j]]=1;
				vis[3][k][mapp[i][j]]=1;
			}
		}
	init();
	dfs(1);
	cout<<ans;
	return 0;		
 } 

你可能感兴趣的:(日常水题解)