求助
查看原帖
求助
257563
Harry_8810楼主2020/12/30 22:48

思路:dfs,先把每行0的个数排一遍,再逐个枚举

求助大佬查代码,查了nn天查不出,
还害得我被JC了一回,把调了一晚上的代码弄丢了

#include<bits/stdc++.h>
#define re register int
using namespace std;
int a[10][10],ans=0,Max=-100;
struct node 
{
	int sa;//一行里面0的个数 
	int ID;//第几行 
}sum[10];
bool cmp(node a,node b){return a.sa<b.sa;}
int num(int x,int y,int n)
{
	if(x==5&&y==5)return n*10;
	else
	{
		if(4<=x&&x<=6&&4<=y&&y<=6)return n*9;
		else
		{
			if(3<=x&&x<=7&&3<=y&&y<=7)return n*8;
			else
			{
				if(2<=x&&x<=8&&2<=y&&y<=8)return n*7;
				else return n*6;
			}
		}
	}
}
void dfs(int x1,int y)
{
	if(y==10)x1++,y=1;
	int x=sum[x1].ID;
	if(a[x][y]==0)
	{
		for(re j=1;j<=9;j++)
		{
			bool flag=true;//是否能填J 
			for(int k=1;k<=9;k++)if(a[x][k]==j||a[k][y]==j)flag=false;//行列里面重复 
			int x2=(x+2)/3,y1=(y+2)/3;
			for(re i=x2*3;i<=x2*3+2;i++)
			{
				for(re k=y1*3;k<=y1*3+2;k++)
				{
					if(a[i][k]==j)flag=false;//宫里面重复 
				}
			}
			if(flag)
			{
				if(x1==9&&y==9)
				{
					Max=max(Max,ans);
					return;
				}
				a[x][y]=j;
				ans+=num(x,y,j);
				dfs(x,y+1);
				ans-=num(x,y,j);
				a[x][y]=0;
			}
		}
	}
	else
	{
		ans+=num(x,y,a[x][y]);
		dfs(x,y+1);
		ans-=num(x,y,a[x][y]);
	}
}
int main()
{
	for(re i=1;i<=9;i++)
	{
		for(re j=1;j<=9;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]==0)sum[i].sa++;
		}
		sum[i].ID=i;
	}
	sort(sum+1,sum+10,cmp);
	dfs(1,1);
	cout<<Max;
	return 0;
}

2020/12/30 22:48
加载中...