码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2676 Sudoku (搜索,Dancing Links)

时间:2014-09-02 14:07:34      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:blog   http   os   使用   ar   for   div   问题   代码   

题目:

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)):

bubuko.com,布布扣DLX模板(from kuangbin)

 

代码:

bubuko.com,布布扣POJ 2676

 

POJ 2676 Sudoku (搜索,Dancing Links)

标签:blog   http   os   使用   ar   for   div   问题   代码   

原文地址:http://www.cnblogs.com/xysmlx/p/3951267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!