如何从二维数组中找到战舰游戏中的舰船数量

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

我需要根据给定的二维数组计算船只的数量(您可以在下面找到示例输入,但它可以是任意长度的二维数组)。 船舶就像您在战舰游戏中看到的那样。 我需要用 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();
 }
}

}

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

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

你需要做两件事:

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

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

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

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

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

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

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