受游戏战舰启发,如何从二维数组中找到棋盘上的船只数量

问题描述 投票:0回答:1

我需要根据给定的二维数组计算船只的数量(您可以在下面找到示例输入,但它可以是任意长度的二维数组)。 船舶就像您在战舰游戏中看到的那样,并且它们之间明显间隔开“0”。船只不会互相接触。 我需要用 C# 编写一个控制台应用程序来解决这个问题。

驱逐舰代表船上有 3 X 个“1”。 (在封闭簇中以任何顺序[如在 2X2 簇内],水平或垂直排列,但不是直对角排列)

潜艇代表船上有 2 X 个“1”。 (水平或垂直排列,但不是对角排列)

巡逻艇代表船上有 1 X 个“1”。

输入示例:

namespace Ships
{
  class Program
  {
    static int[,] ships = new int[4, 10] {
    { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, },
    { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, },
    { 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, },
    { 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, },
  };

  static void Main(string[] args)
  {
    int countDestroyers  = 0;
    int countSubmarines  = 0;
    int countPatrolBoats  = 0;

    // code write here

    Console.WriteLine(countDestroyers);
    Console.WriteLine(countSubmarines);
    Console.WriteLine(countPatrolBoats);
  
    Console.ReadLine();
  }
 }
}

一些澄清。 :)

目的是找到一种解决方案,针对给定的有效“战舰”场景(因此真正的战舰规则不适用)来查找和分类船只。棋盘数组将由 0 和 1 组成,并且每条船在输入中将至少由 0 分隔。 (因此无需检查/验证输入是否包含 111111)。

c# matrix optimization multidimensional-array
1个回答
1
投票

您不需要为此进行矩阵计算。二维数组只是存储数据的一种方法。

你需要做两件事:

  1. 找到任何包含船只碎片的字段。
  2. 向各个方向观察直至棋盘的边界,找到正交相邻的“1”,计算“1”的数量即可了解它是什么。

编程时,您通常希望有一些小方法来完成“一件事”。

所以我的建议是采用一种方法,使用两个嵌套的 for 循环来迭代行和列,以查找“1”。当它找到一个时,它会使用行索引和列索引调用不同的方法。

第二种方法查看正交相邻的单元格,一次一个方向(向下和向左)。这对于指数来说是完全可行的。你的尺寸计数器从 1 开始,如果你在任何方向上发现另一个 1,你就会增加该计数器并继续朝那个方向寻找。一旦您击中 0 或棋盘边缘,您就可以使用计数器来确定船舶的类型。

剩下的唯一两件事是 a) 防止第一种方法找到你已经找到的船只 1。最简单的方法可能是暂时将计数的 1 更改为不同的值,例如2.另一件事要担心的是如何存储船舶信息,但这可能是一个具有行+列索引的

record struct
,船舶类型作为枚举,以及水平/垂直方向枚举。

注意:在您的示例中,输入并不明确,因为它有 3 个 L 形的 1,可能是 2+1 或 1+2。如果 - 如您的代码所示 - 您只想计算船只数量,那么边缘情况并不重要,因为无论您首先检查哪个方向,您总是会计算 1x 2 的大小,然后计算 1x 剩余的 1。

对于类似的输入

1 1 1
1 0 0

然而,解决方案并不明确,因为它可能是 2x2 或 1x3+1x1。对于这种情况,结果将取决于您首先检查相邻 1 的方向。

© www.soinside.com 2019 - 2024. All rights reserved.