zoukankan      html  css  js  c++  java
  • 靶形数独

    当成搜索题来做的,

      直接搜肯定不行需要优化一下,权值打表就行了。

                    先搜索最少的,可以减少运算次数。

                    用二进制数表示某个数是否能用。

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<math.h>
    using namespace std;
    int place[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 f3[4][4][10];
    int map[10][10],f1[10][10],f2[10][10],ans,tot,a[100][2],cnt,can[10][10];
    void dfs(int o,int z)
    {
        if(o==cnt+1)    {ans=max(ans,z);return ;}
        int x,y,minn=999999999;
        memset(can,0,sizeof(can));
        for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        if(!map[i][j])
        {
            for(int k=1;k<=9;k++)
            if((!f1[i][k])&&(!f2[j][k])&&(!f3[(i+2)/3][(j+2)/3][k]))
            can[i][j]++;
            if(can[i][j]<minn)    minn=can[i][j],x=i,y=j;
            if(can[i][j]==1)    break;
        }
        if(!minn)    return;    //从少的开始搜 
        
        for(int i=1;i<=9;i++)    
        if((!f1[x][i])&&(!f2[y][i])&&(!f3[(x+2)/3][(y+2)/3][i]))
        {
            map[x][y]=1;
            f1[x][i]=1;
            f2[y][i]=1;
            f3[(x+2)/3][(y+2)/3][i]=1;        
            dfs(o+1,z+i*place[x][y]);
            f1[x][i]=0;
            f2[y][i]=0;
            f3[(x+2)/3][(y+2)/3][i]=0;
            map[x][y]=0;
        }
        return;
    }
    int main()
    {
        int c;
        for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        {
            scanf("%d",&c);
            map[i][j]=c;
            f1[i][c]=1;
            f2[j][c]=1;
            f3[(i+2)/3][(j+2)/3][c]=1;
            tot+=c*place[i][j];
            if(!c)    a[++cnt][0]=i,a[cnt][1]=j;
        }
        ans=tot;
        dfs(1,ans);
        if(ans!=tot)    printf("%d",ans);
        else cout<<-1;
        return 0;
    }

    位运算还没写好

  • 相关阅读:
    ffmpeg h264编码 extradata 为空
    MySQL主从复制报错一致性问题解决
    MySQL 子查询优化案例
    RAC+单节点搭建DG
    总结搭建Oracle11g DG踩的坑
    解决开机自动调用脚本失败的问题
    MySQL版本升级之5.6到5.7
    MySQL 通过semi join 优化子查询
    MySQL 配置文件中忘配置default-character-set引发的乱码问题
    MySQL5.6下使用xtrabackup部分备份恢复到MySQL5.7
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6378321.html
Copyright © 2011-2022 走看看