引.精确覆盖问题:
给定一个矩阵0-1矩阵,如:
1 | 0 | 1 |
0 | 0 | 1 |
0 | 1 | 0 |
判断或输出一些行,这些行的在同一列上有且仅有一个1,如上面的第1和第3行就符合条件。
这个问题是NPC问题,必须用搜索。但是解决这么一个问题有什么用呢?
一。实际问题转化为精确覆盖问题解决
这里以数独为例。数独的游戏规则是:
在一个9*9格图中填入1-9这九个数字各9次,使得格图中每行/每列,以及3*3小方块中都不包含两个同样的数字,如下图:
那么这个问题怎么转化为精确覆盖问题呢?
回到精确覆盖的定义,我们要寻找的是那些同一列上含且仅含一个1的行。那么,把同一列上的1看成全局必须满足的条件,而且这种条件必须只满足一次。
分析数独问题的全局条件:
1.首先,一个格子上的数字必须有且仅有一个数字2.每一行上必须包含且仅包含一个1/2/3.。。3,每一列上必须。。。4.每个小方各上。。。
这样子问题就清晰了,我们要找的各个行最后可以拼凑一个完整的全1行,满足这个性质的那些行就代表了数独已经完成填写。
有了上面的分析,我们可以定义:
1.81个列 代表某格子上有数字
2.81个列 代表某行上已经有某数字
3.81个列 代表某列上已经有某数字
4.81个列 代表某小方格上已经有某数字
这样就需要81*4个列,另外,一个小方格上可能填9个数字,故需要81*9行(方格上数字确定了,后面81*3列上是否是1也就确定了,故状态其实没有那么多。
至此,数独问题也就转化成精确覆盖问题了。