这道题最好想到的就是深搜的操作,然而看到数据范围,我们还是要对深搜本身和一些剪枝方法进行优化。
首先打表将得分数组记录下来,一开始的思路是dfs每个格子,当指针到82时停下来。手写判断函数,对是否在同一行、是否在同一列、是否在同一个宫进行判断(一开始用的是循环 这里可以优化)。由于读入格子时我们可以算出横纵坐标, hang=(x-1)/9+1;
lie=(x-1)%9+1;如果有数了就dfs下一层,枚举1-9,能填就填,dfs下一层后回溯。这样我们可以得到大概25分左右
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
int a[10][10];
int ans;
int maxx=-1e9;
int score[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}};
void cal()
{
ans=0;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
ans+=a[i][j]*score[i][j];
}
}
}
bool pd(int x,int y,int num)
{
for(int i=1;i<=9;i++)
{
if(a[x][i]==num||a[i][y]==num) return false;
}
if(x<=3&&y<=3)
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
if(a[i][j]==num) return false;
}
if(x<=3&&y>=4&&y<=6)
{
for(int i=1;i<=3;i++)
for(int j=4;j<=6;j+&#