如题,程序如下
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int weight[10][10]=
{
{0,0,0,0,0,0,0,0,0,0},
{0,6,6,6,6,6,6,6,6,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,9,10,9,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,6,6,6,6,6,6,6,6}
};//分数初始化
int cb[10][10]= {0};//二维数组存储填完后的答案
int hang[10],shu[10],block[10];//行,列,宫格
int ANS=-1;
struct note
{
int num,kong;//num存行的编号,kong存0的个数
friend bool operator < (note a,note A)
{
return a.kong > A.kong;
} //按0的个数排序
} mjj[11];
inline int maxx(int a,int A)
{
if(a-A>0)return a;
return A;
}
inline void output()
{
int ans=0;
for(int j=1; j<10; j++)
{
for(int i=1; i<10; i++)
{
ans+=cb[i][j]*weight[i][j];
}
}
ANS=maxx(ans,ANS);
return;
}//计算分数并输出答案
inline void dfs(int x,int Y)
{ //dfs深搜,一个一个格子填数
int y=mjj[Y].num;
if(x==9&&y==0)output();//递归结束,到了第九行,第0列
if(cb[x][y]) //如果是数字1
{
if(x==1)dfs(9,Y+1);//下一列(如果在第九行
else dfs(x-1,Y);//上一行
return;
}
int bloc=(y-1)/3*3+(x-1)/3+1;
for(int k=1,tmp=1; k<=9; ++k,tmp<<=1) //搜索填数
{
if(hang[y]&tmp) continue;
if(shu[x]&tmp) continue;
if(block[bloc]&tmp) continue;//剪枝
hang[y]|=tmp; //从行中去除这次填的数
shu[x]|=tmp;//列
block[bloc]|=tmp;//这个宫格
cb[x][y]=k; //填进去
if(x==1)dfs(9,Y+1);
else dfs(x-1,Y);
cb[x][y]=0;
hang[y]^=tmp;
shu[x]^=tmp;
block[bloc]^=tmp;
}
return;
}
int main()
{
char g=getchar();
for(int j=1; j<=9; j++) //i列j行
{
int blc=(j-1)/3*3;
mjj[j].num=j;
for(int i=1; i<=9; i++)
{
while(!isdigit(g)) g=getchar();
if(g^=48) mjj[j].kong++;//零的数目
else continue;
cb[i][j]=g;
hang[j]|=(1<<(g-1));//记录当前行的数
shu[i]|=(1<<(g-1));// 记录列的数
block[blc+(i-1)/3+1]|=(1<<(g-1)); //它是哪个宫格的
}
}
sort(mjj+1,mjj+10);//对数组进行排序,排序后的顺序即为填写的数据
mjj[10].num=0;
dfs(9,1);//从第九行,第一列开始dfs
printf("%d",ANS);
return 0;
}
这是本人理解,如有不足请大佬指正