DFS之剪枝与优化AcWing 166. 数独

DFS之剪枝与优化AcWing 166. 数独

原题链接

AcWing 166. 数独

算法标签

搜索 深度优先搜索 DFS

思路

优化搜索顺序: 从当前能填合法数字最少的位置开始填数字
排除等效冗余: 任意一个状态下,我们只需要找一个位置填数即可,而不是找所有的位置和可填的数字.
位运算:由于涉及大量check判定(即判断数字放在该行, 列, 九宫格),对check进行优化,
优化方式
对于每一行,每一列,每一个九宫格,利用一个九位二进制数保存,当前还有哪些数字可以填写.
lowbit: 取出当前可以能填的数字.

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include
#define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;ib;--i)
using namespace std;
typedef pair PII;
const int N=9, M=1<'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
}
void init(){
	//初始状态9位二进制全是1 即所有位置可填写
    rep(i, 0, N){
        r[i]=c[i]=(1<>j&1;
	    }
	}
	while(scanf("%s", str), str[0]!='e'){
	    init();
	    int cnt=0;
	    for(int i=0, k=0; i

参考文献
AcWing 166. 数独(算法提高课)y总讲解
AcWing 166. 数独题解

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

你可能感兴趣的:(算法,深度优先,剪枝,算法)