zoukankan      html  css  js  c++  java
  • POJ3074 Sudoku 剪枝深(神?)搜

    emm。。。挺秀的。。。挺神的?


    每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了;

    这样可以通过lowbit取出每一个没有选过的数;(妙啊?

    关于剪枝:每次选状态数最小的位置(就是能选择的数少的位置)去向下搜索(需要预处理出每个数代表的状态能选择的数)


    记着把我的读入改了。。我的读入好像有问题。。。反正交上去就WA了,但scanf没事,,,,,麻烦大佬指明一下错误QAQ。。。

    #include<cstdio>
    #include<iostream>
    #define lbt(x) (x&-x)
    #define cal(i,j) ((i/3)*3+(j/3))
    #define R register int
    using namespace std;
    inline void gstr(char* s) {
        register char ch; while(isspace(ch=getchar())); 
        do *s++=ch; while(!isspace(ch=getchar()));
    }
    int h[9],l[9],e[9],cnt[512],lg[512],tot;
    char a[10][10];
    inline void f(int i,int j,int x) {h[i]^=1<<x,l[j]^=1<<x,e[cal(i,j)]^=1<<x;}
    bool dfs(int crt) {
        if(crt==0) return true;
        R tmp=10,x,y;
        for(R i=0;i<9;++i) for(R j=0;j<9;++j) {
            if(a[i][j]!='.') continue;
            R vl=h[i]&l[j]&e[cal(i,j)];
            if(!vl) return false;
            if(cnt[vl]<tmp) tmp=cnt[vl],x=i,y=j;//找到状态量最少的位置 
        } R vl=h[x]&l[y]&e[cal(x,y)];
        for(;vl;vl-=lbt(vl)) { R z=lg[lbt(vl)];
            a[x][y]='1'+z; f(x,y,z);
            if(dfs(crt-1)) return true;
            f(x,y,z); a[x][y]='.';
        } return false;
    }
    signed main() {
        for(R i=0;i<1<<9;++i) for(R j=i;j;j-=lbt(j)) ++cnt[i];
        for(R i=0;i<9;++i) lg[1<<i]=i; register char s[100];
        while(gstr(s),s[0]!='e') {
            for(R i=0;i<9;++i) for(R j=0;j<9;++j) a[i][j]=s[i*9+j];
            for(R i=0;i<9;++i) h[i]=l[i]=e[i]=(1<<9)-1; tot=0;
            for(R i=0;i<9;++i) for(R j=0;j<9;++j) if(a[i][j]!='.') f(i,j,a[i][j]-'1');
                else ++tot; dfs(tot);
            for(R i=0;i<9;++i) for(R j=0;j<9;++j) s[i*9+j]=a[i][j]; printf("%s
    ",s);
        }    
    }

    2019.04.26

  • 相关阅读:
    1300 · 巴什博弈
    1 · A + B 问题
    37 · 反转一个3位整数
    145 · 大小写转换
    Spring-Boot整合freemarker引入静态资源css、js等
    Monkey API学习与脚本编写小记
    Mac终端快速启动uiautomatorviewer
    Mac解决使用uiautomatorviewer会报错:./uiautomatorviewer 03:56:07 E/Screenshot: Unsupported protocol: 2
    charles抓包https乱码问题解决-转载
    mac解决adb devices命令找不到真机设备
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10771975.html
Copyright © 2011-2022 走看看