递归 - 船战

时间:2012-06-04 16:22:35

标签: java algorithm recursion

我正在尝试用 java 编写一个小型战斗游戏。

100%学术,我用它来练习递归,所以...我想用它而不是迭代,即使它在大多数时更简单,更有效某些情况。

让我们开始做生意。这些是规则:

  • 船舶宽度为1,2或3格,仅水平放置。
  • 水用0表示,未击中的船只单元格为1,命中的船只单元格为2,沉没的船只用3中的所有单元格。

设置这些规则后,我使用以下数组进行测试:

int[][] board = new int[][]
{
    {0, 1, 2, 0, 1, 0},
    {0, 0, 1, 1, 1, 0},
    {0, 3, 0, 0, 0, 0},
    {0, 0, 2, 1, 2, 0},
    {0, 0, 0, 1, 1, 1},
};

到目前为止它工作得很好,为了使它更加用户友好,我想添加一些报告。这些是我需要的方法:

  1. 给定矩阵,返回其中的船只数量。
  2. 与a)相同,但是按州分开(非击中船只,击中和沉没船只的数量)。
  3. 我需要掌握这些报告,我想得到一些想法。

    记住必须使用递归来完成,我想了解这一点,唯一的方法就是练习!

    非常感谢你的时间和耐心:)。

2 个答案:

答案 0 :(得分:0)

除非您指定船只必须用0分隔,否则这是不可能的。否则,1,1可以是长度为2的船舶,或两艘长度为1的船舶。

鉴于这种限制,你的两份报告都可以/应该作为一个单一的过程完成,将地图变成船只清单。

我不太喜欢写出递归包装器(我假设您知道如何使用递归函数对数组进行“迭代”),所以我正在跳过该部分。

  1. 循环遍历行,因为船只不能跨越行,可以单独处理它们。
  2. 对于每个州级船舶数据可以在(无船舶,船舶,沉没船舶),具有功能
  3. 此函数检查下一个元素
    1. 不存在
    2. 与当前版本相同(可以由不同的功能进行硬编码)
    3. 与当前的不同(转到右边)。
  4. 当你遍历数组时,你会组装一个船只列表。
  5. 您现在有一份船只清单,您可以计算
  6. 的长度或执行更复杂的报告

    使用非硬编码的单个函数可能会或者可能不会更好,但这似乎有点困难,并且只有三个选项,硬编码不是太多的代码开销(因为所有三个做得有所不同)。

    或者,你可以使用一个完全独立的方法,你可以在地图上迭代计算船只的“上升边缘”。这是一个重量轻得多的解决方案,但是无法为您提供与结果数据相关的灵活性。

    ...通过更轻的重量,我的意思是“可以使用正则表达式完成”

答案 1 :(得分:0)

嗯,这看起来比这里的人看起来更简单。

我可以看到递归的方式可以用来考虑整个矩阵中的船舶数量,即第一行中的船舶数量加上其余部分的船舶数量基质

如果你能解决这个问题,那就准备好了。

如何吗

考虑你的基本情况,停止递归调用的条件是什么?

解决连续统计船舶的方式。

如果有,请返回行中的船只数量以及矩阵其余部分的船只。

我相信你方法的签名是这样的......

ShipCount(int[][] matrix, int numberOfRows, int numberOfCellsPerRow)

假设计数器变量称为“计数”。你会有类似的东西:

//Signature
{
    int count = 0;
    if(/*Base condition*/){
    }else{
        /*Count the ships, work with the "count" variable.*/
    }
    return count + ShipCount(matrix[][], numberOfRows - 1, numberOfCellsPerRow) /*"numberOfRows - 1" takes you to the next row.*/
}

祝好运#2:)