#P2032. Square Carpets
Square Carpets
描述
Frugal先生买了一栋新房子。他深深地爱上了这栋新房子,因为里面有一个舒适的客厅,可以让他完全放松。他认为这栋新房子买得非常划算。
然而,让他失望的是,客厅的地板上有一些划痕。
地板呈矩形,由方形面板铺设而成。他想要将所有划痕面板更换为完好的面板,但他负担不起这笔费用。于是,他决定用地毯覆盖所有划痕面板。
他可以使用的地毯具有以下特点:
- 地毯为正方形。
- 地毯可以相互重叠。
- 地毯不能折叠。
- 提供不同尺寸的地毯,地毯的边长是面板边长的整数倍。
地毯必须覆盖所有划痕面板,但不能覆盖任何完好的面板。
例如,如果划痕面板如图所示,则至少需要块地毯。
图:示例覆盖
由于地毯的价格与其尺寸无关,Frugal先生希望尽可能减少使用的地毯数量。
你的任务是编写一个程序,计算覆盖所有划痕面板所需的最少地毯数量。
输入
输入包含多个数据集。输入以一行包含两个的行表示结束。
数据集
数据集
...
数据集
每个数据集(DataSet)表示地板的状态。数据集的格式如下:
...
...
...
...
其中,正整数和分别表示客厅在和方向上的面板数量。和的值不超过。整数表示面板的状态,其值为:
:完好面板(不得覆盖),
:划痕面板(必须覆盖)。
输出
对于每个数据集,你的程序应输出一行,包含一个整数,表示覆盖所有划痕面板所需的最少地毯数量。
样例输入
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
8 8
0 1 1 0 0 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 1 1 0 0 1 1 0
0 1 1 0 0 1 1 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 1 1 0 0 1 1 0
10 10
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 0 1 1 0 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 0 1 1 0 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 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1
0 0
样例输出
2
6
14
29