思路:dfs,先把每行0的个数排一遍,再逐个枚举
求助大佬查代码,查了n天查不出,
还害得我被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;
}