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

    位运算还没写好

  • 相关阅读:
    单例/单体模式(Singleton)
    步步为营 .NET 设计模式学习笔记 六、Adapter(适配器模式)
    分享18个非常棒的 jQuery 表格插件
    线程池 vs 专有线程
    介绍27款经典的CSS框架
    一些系统开发及项目管理的资料
    SQL数据库中的XML应用
    SQLite之初体验
    AsyncBox 一款基于 jQuery 的弹窗组件
    弹出图片层
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6378321.html
Copyright © 2011-2022 走看看