读程序
查看原帖
读程序
431144
Lunatic_Iris楼主2021/12/24 20:38

如题,程序如下

#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;
}

这是本人理解,如有不足请大佬指正

2021/12/24 20:38
加载中...