xqz出的一套题中的一个,没想到是搜索……
一开始不敢写,后来看到何天扬的比std快,他用的是dancing links。为了一探究竟,我也来看看这神奇的dancing links。
看了秋哥面前小菜的Knuth的原文,历经千辛万苦,经历艰难险阻,看了杂七杂八的源码,最后终于写出一个dancing links了……
第一次测,只过了两个点,其余全部tle。一查,发现循环写错了,导致全部死循环……
改了之后,重新测,秒了std……
std用的是IDA*,一开始时用了3.34s,加了启发式函数果然快……瞬间降至0.39s!看来如果不写dancing links,启发式还是要写的。
但是,我的dancing links如果加了启发式,那么,速度0.25s!不愧是knuth!
P.S 这个题刷新了我用for的记录,以前是由APIO的oil保持,22个for,现在升级为26个for!
原题:
MR.J的地毯
【问题描述】
MR.J刚刚买了一套房子,但有点小瑕疵:有一些地板不美观。于是,他想买一些地毯把不美观的地板遮起来。地毯必须把所有有瑕疵的地板遮起来,而不能遮到没有瑕疵的地板,地毯可以重复覆盖。具体来说,现在有一个n*m的01矩阵,如果某个位置是1,则代表它要被覆盖,否则不能被覆盖。请你用最少个数的正方形覆盖所有的1,可以重复覆盖。
【输入格式】
输入包括多组数据,以一组0 0结束。
每组数据的第一行为正整数m,n
接下来一个n*m的01矩阵
【输出格式】
对于每组数据,输出最少正方形个数。
【样例输入】
4 3
0 1 1 1
1 1 1 1
1 1 1 1
8 5
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1
0 1 1 1 0 1 1 1
0 0
【样例输出】
2
6
【数据说明】
30%:N,M<=10
100%:N,M<=20.数据组数<=5.