我需要根据给定的二维数组计算船只的数量(您可以在下面找到示例输入,但它可以是任意长度的二维数组)。 船舶就像您在战舰游戏中看到的那样。 我需要用 C# 编写一个控制台应用程序来解决这个问题。
驱逐舰代表船上有 3 X 个“1”。 (任何顺序,水平或垂直排列,但不是对角排列)
潜艇代表船上有 2 X 个“1”。 (水平或垂直排列,但不是对角排列)
巡逻艇代表船上有 1 X 个“1”。
输入示例:
namespace Ships
{
class Program
{
static int[,] ships = new int[10, 4] {
{ 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();
}
}
}
您不需要为此进行矩阵计算。二维数组只是存储数据的一种方法。
你需要做两件事:
编程时,您通常希望有一些小方法来完成“一件事”。
所以我的建议是采用一种方法,使用两个嵌套的 for 循环来迭代行和列,以查找“1”。当它找到一个时,它会使用行索引和列索引调用不同的方法。
第二种方法查看正交相邻的单元格,一次一个方向(向下和向左)。这对于指数来说是完全可行的。你的尺寸计数器从 1 开始,如果你在任何方向上发现另一个 1,你就会增加该计数器并继续朝那个方向寻找。一旦您击中 0 或棋盘边缘,您就可以使用计数器来确定船舶的类型。
剩下的唯一两件事是 a) 防止第一种方法找到你已经找到的船只 1。最简单的方法可能是暂时将计数的 1 更改为不同的值,例如2.另一件事要担心的是如何存储船舶信息,但这可能是一个具有行+列索引的
record struct
,船舶类型作为枚举,以及水平/垂直方向枚举。