如何验证战舰领域?

evg*_*iuz 8 java algorithm

我试图用这些规则来验证战舰领域:

  • 船舶不得与侧面或角落接触;
  • 船是直的;
  • 有1×4甲板船,2×3甲板,3×2甲板,4×1甲板船.

该字段表示为byte[10][10]数组.我可以用什么算法来实现这个目标?我使用的语言是Java,但任何语言都很好.

mpe*_*kov 9

快速检查有效性:1×4甲板船,2×3甲板,3×2甲板,4×1甲板船只必须正好占用1*4 + 2*3 + 3*2 + 4*1 = 20个细胞.因此,如果您的字段不包含20个单元格,则它无效(船舶重叠或船舶不足)

现在,您需要验证每种类型的船的数量是否正确,并且船舶不会接触.您可以通过连接组件分析来完成此操作.简单的两遍算法将在这里完成(链接中有伪代码和示例).这将为您提供场中每个"blob"的大小,位置和形状.

从那里,你只需要迭代每个blob并检查它是垂直线还是水平线.这很简单 - 只计算blob的宽度(最大和最小列值之间的差异)和高度(最大和最小行值之间的差异).其中一个必须等​​于1.如果不是,则两艘船正在接触,并且该场无效.

最后,检查每种船型的编号是否正确.如果不这样做,则该字段无效.如果你这样做,该字段是有效的,你就完成了.

编辑

船舶也可以端到端接触,但这会减少船舶总数(增加某种类型的船舶数量),从而无法进行最后一次测试.

编辑2

已更正使用正确的船舶规格.