• 靶形数独


    90 分
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int flag[99][99];
    int s=0;
    int a[9][9]={
     {6,6,6,6, 6,6,6,6,6}
    ,{6,7,7,7, 7,7,7,7,6}
    ,{6,7,8,8, 8,8,8,7,6}
    ,{6,7,8,9, 9,9,8,7,6}
    ,{6,7,8,9,10,9,8,7,6}
    ,{6,7,8,9, 9,9,8,7,6}
    ,{6,7,8,8, 8,8,8,7,6}
    ,{6,7,7,7, 7,7,7,7,6}
    ,{6,6,6,6, 6,6,6,6,6}
    };
    int c[9][9]={
        1,1,1,2,2,2,3,3,3,
        1,1,1,2,2,2,3,3,3,
        1,1,1,2,2,2,3,3,3,
        4,4,4,5,5,5,6,6,6,
        4,4,4,5,5,5,6,6,6,
        4,4,4,5,5,5,6,6,6,
        7,7,7,8,8,8,9,9,9,
        7,7,7,8,8,8,9,9,9,
        7,7,7,8,8,8,9,9,9,
    };
    int b[99][99];
    int f[10][10];
    int fh[10][10];
    int fs[10][10];
    int max1=-1;
    int f4;
    void dfs(int x,int y,int ans)
    {
        if(f4==1) return;
            if(x==0&&y==9)
        {   f4=1;
            for(int i=0;i<=8;i++)
            {
                for(int j=0;j<=8;j++) 
                printf("%d ",b[i][j]);
                printf("
    ");
    
    
            }
            //max1=max(ans,max1);
           // return;
        }
            if(!b[x][y]) 
        {   
            for(int i=1;i<=9;i++)
            if(fh[x][i]==0&&fs[y][i]==0&&f[c[x][y]][i]==0)
            {
                b[x][y]=i;
                    fh[x][i]=1;
                    fs[y][i]=1;
                    f[c[x][y]][i]=1;
            if(x<8)
                {
    
                    dfs(x+1,y,ans+a[x][y]*i);
    
                }
                else {
                    dfs(0,y+1,ans+a[x][y]*i);
    
                }
                    fh[x][i]=0;
                    fs[y][i]=0;
                    f[c[x][y]][i]=0;
                    b[x][y]=0;
            }
            }
            else
            {
                if(x<8)
                dfs(x+1,y,ans);
                else dfs(0,y+1,ans);
            }
    
    
    }
    int main()
    {
        for(int i=0;i<=8;i++)
        for(int j=0;j<=8;j++) 
        {
            scanf("%d",&b[i][j]);
            if(b[i][j])
            {
            fh[i][b[i][j]]=1;
            fs[j][b[i][j]]=1;
            f[c[i][j]][b[i][j]]=1;
            s+=a[i][j]*b[i][j];
            }
    
    
        }
        dfs(0,0,s);
        printf("%d",max1);
        return 0;
    }

    可以解数独游戏了!!!
    这个题一开始我是蛇形遍历,有点麻烦
    。。。
    后来看了xy的便改了

    sxb大神思路
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int s=0;
    int n=0;
    int can[10][10];//记录能填多少数 
    int a[9][9]={
     {6,6,6,6, 6,6,6,6,6}
    ,{6,7,7,7, 7,7,7,7,6}
    ,{6,7,8,8, 8,8,8,7,6}
    ,{6,7,8,9, 9,9,8,7,6}
    ,{6,7,8,9,10,9,8,7,6}
    ,{6,7,8,9, 9,9,8,7,6}
    ,{6,7,8,8, 8,8,8,7,6}
    ,{6,7,7,7, 7,7,7,7,6}
    ,{6,6,6,6, 6,6,6,6,6}
    };//打表 
    int c[9][9]={
        1,1,1,2,2,2,3,3,3,
        1,1,1,2,2,2,3,3,3,
        1,1,1,2,2,2,3,3,3,
        4,4,4,5,5,5,6,6,6,
        4,4,4,5,5,5,6,6,6,
        4,4,4,5,5,5,6,6,6,
        7,7,7,8,8,8,9,9,9,
        7,7,7,8,8,8,9,9,9,
        7,7,7,8,8,8,9,9,9,
    };
    int b[99][99];
    int f[10][10];
    int fh[10][10];
    int fs[10][10];
    int max1=-1;
    int f1(int x,int y,int k)
    {
        if(!fh[x][k]&&!fs[y][k]&&!f[c[x][y]][k])
            return 1;
        return 0;
    }
    void dfs(int X,int ans)
    {
            if(X>(81-n))//已填完 
        {
            max1=max(ans,max1);
            return;
        }
         memset(can,0,sizeof(can));
         int x,y,mmin=99999999;
        for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
        if(!b[i][j])
        {
            for(int k=1;k<=9;k++)
            if ( f1(i,j,k) ) can[i][j]++;
    
            if(can[i][j]<mmin)
            {
                mmin=can[i][j];
                x=i; 
                y=j;
            }//找最小 
            if(mmin==1) break;//找到只能填一个的退出 
        }
        if(mmin==0)//无结果 
        return ;
        /*if(mmin==99999999)//已填完 ,应该没用
        {
            max1=max(ans,max1);
            return;
        }*/
         for(int i=1;i<=9;i++)  
        {
            if(f1(x,y,i))
            {
                b[x][y]=i;
                fh[x][i]=1;
                fs[y][i]=1;
                f[c[x][y]][i]=1;
                dfs(x+1,ans+a[x][y]*i);
                b[x][y]=0;
                fh[x][i]=0;
                fs[y][i]=0;
                f[c[x][y]][i]=0;
            }
        } 
    }
    int main()
    {
        for(int i=0;i<=8;i++)
        for(int j=0;j<=8;j++) 
        {
            scanf("%d",&b[i][j]);
            if(b[i][j])
            {
            fh[i][b[i][j]]=1;
            fs[j][b[i][j]]=1;
            f[c[i][j]][b[i][j]]=1;
            s+=a[i][j]*b[i][j];//记录已填的价值 
            n++;//记录已填的数 
            }
    
    
        }
        dfs(1,s);
        printf("%d",max1);
        return 0;
    }
    

    这个思路666,直接就a了otc

  • 相关阅读:
    生成器
    迭代器
    闭包函数
    装饰器(2)
    装饰器(1)
    名称空间与作用域(2)
    110.网络编程-mail
    109.网络编程-FTP
    108.网络编程-TCP/UDP
    107.xpath
  • 原文地址:https://www.cnblogs.com/wspl98765/p/6819899.html
Copyright © 2020-2023  润新知