我试图用这些规则验证
battleship字段:
>船舶不得与侧面或角落接触;
>船是直的;
>有1×4甲板船,2×3甲板,3×2甲板,4×1甲板船.
该字段表示为byte [10] [10]数组.
我可以用什么算法来实现这个目标?
我使用的语言是Java,但任何语言都很好.
解决方法
快速检查有效性:1×4甲板船,4×1甲板船只必须正好占用1 * 4 2 * 3 3 * 2 4 * 1 = 20个单元.因此,如果您的字段不包含20个单元格,则它无效(船舶重叠或船舶不足)
现在,您需要验证每种类型的船舶的数量是否正确,并且船舶不会接触.你可以通过connected component analysis执行此操作.这里将使用简单的双通算法(链接中有伪代码和示例).这将为您提供场中每个“blob”的大小,位置和形状.
从那里,你只需要迭代每个blob并检查它是垂直线还是水平线.这很简单 – 只计算blob的宽度(最大和最小列值之间的差异)和高度(最大和最小行值之间的差异).其中一个必须等于1.如果不是,则两艘船正在接触,并且该区域无效.
最后,检查每种船型的编号是否正确.如果不这样做,则该字段无效.如果您这样做,该字段有效,您就完成了.
编辑
船舶也可以端对端接触,但这会减少船舶总数(增加某种类型的船舶数量),从而无法进行最后一次测试.
编辑2
已更正使用正确的船舶规格.