首页 > 代码库 > POJ 2676 Sudoku (搜索,Dancing Links)

POJ 2676 Sudoku (搜索,Dancing Links)

题目:

http://poj.org/problem?id=2676

 

题意:

数独,每行1-9,每列1-9,每3*3小格1-9,填数,不能重复

 

方法:Dancing Links(16ms)或者DFS暴搜(400-900ms)

Dancing Links(DLX) 是为了解决矩阵精确覆盖问题的算法,算法效率非常高

使用DLX解决的问题必须转化为矩阵精确覆盖问题:

1、DLX详解:

http://wenku.baidu.com/view/d8f13dc45fbfc77da269b126.html

2、转化方法:

非常详细的讲解:http://www.cnblogs.com/grenet/p/3163550.html

约束1:每个格子只能填一个数:dlx.Link(t, encode(0, i, j));

约束2:每行需1-9:dlx.Link(t, encode(1, i, k - 1));

约束3:每列需1-9:dlx.Link(t, encode(2, j, k - 1));

约束4:每3*3格子需1-9:dlx.Link(t, encode(3, (i / 3) * 3 + j / 3, k - 1));

 1 void build() 2 { 3     for (int i = 0; i < 9; i++) 4         for (int j = 0; j < 9; j++) 5             for (int k = 1; k <= 9; k++) 6                 if (mtx[i][j] == ‘0‘ || mtx[i][j] == k + ‘0‘) 7                 { 8                     int t = encode(i, j, k - 1); 9                     dlx.Link(t, encode(0, i, j));10                     dlx.Link(t, encode(1, i, k - 1));11                     dlx.Link(t, encode(2, j, k - 1));12                     dlx.Link(t, encode(3, (i / 3) * 3 + j / 3, k - 1));13                 }14 }

 

DLX模板(转自kuangbin(http://www.cnblogs.com/kuangbin/p/3752854.html)):

DLX模板(from kuangbin)

 

代码:

POJ 2676

 

POJ 2676 Sudoku (搜索,Dancing Links)