我需要根据给定的二维数组计算船只的数量(您可以在下面找到示例输入,但它可以是任意长度的二维数组)。 船舶就像您在战舰游戏中看到的那样,并且它们之间明显间隔开“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)。
您不需要为此进行矩阵计算。二维数组只是存储数据的一种方法。
你需要做两件事:
编程时,您通常希望有一些小方法来完成“一件事”。
所以我的建议是采用一种方法,使用两个嵌套的 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 的方向。