题目:
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
时间: 2024-10-12 16:00:42