【问题标题】:How can I calculate the number of ships in the battleship game如何计算战舰游戏中的舰船数量
【发布时间】:2021-11-30 06:51:31
【问题描述】:

需要计算船的数量。船舶以“战舰”游戏的形式呈现。

“1”代表船,“0”代表水。 C#

namespace Ships
 {
 class Program
  {
  static int[,] ships = new int[10, 10] {
      { 0, 0, 0, 0, 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, 1, 0, 0, 1, 1, 1, },
      { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
      { 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
      { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }
  };

  static void Main(string[] args)
  {
     int count = 0;

     // code write here
    
     Console.WriteLine(count);

     Console.ReadLine();
  }
 }
}

【问题讨论】:

  • 从技术上讲,你不能。板上没有足够的信息编码,因为如果您在 2x1 或 3x1 旁边有一个 1x1,则无法知道那是两艘船还是一艘。
  • 就我个人而言,我会采取懒惰的路线,并根据其长度为每种类型的船使用不同的编号。 1x1 是 1,2x1 是 2,依此类推。
  • @JSGarcia - 我刚刚检查了孩之宝的类似规则。相信这是一个共同的家规,而不是官方的。
  • @JSGarcia 绝对不是真的。你不能去对角线或重叠,但你肯定会在邻接方面很棘手。
  • 是否必须使用二维数组?因为我只是使用它,而是选择跟踪单个飞船实例并以此动态渲染战场。这在很多方面都会变得容易得多,包括跟踪船只数量。

标签: c# arrays


【解决方案1】:

基于重写的问题和您评论中的澄清..

int count = ships.Cast<int>().Count(x => x == 1);  

这将计算二维数组中 1 的数量(在您的示例中为 20)。 Sum() 会稍微简单一些,但我认为 Count 在这个用例中更能自我记录,如果您决定使用 1 以外的值,则更容易更改。

对于非 LINQ 方法,您可以执行以下操作:

int count = 0;
for (int i = 0; i < ships.GetLength(0); i++)
{
    for (int j = 0; j < ships.GetLength(1); j++)
    {
        if (ships[i, j] == 1)
            count++;

        //Could also just do:
        //count += ships[i, j];
        //Since you're only working with 1 and 0
    }
}

【讨论】:

  • 哇,是的,那是……甚至不再是同一个问题了……
【解决方案2】:

不可能:想象一下你有这个:

1 1 1
1 1 1

这是长度为 3 的两个还是长度为 2 的三个?

你需要澄清你的问题。

【讨论】:

  • 即使在战舰的正常规则中,如果你只找到一个 1x3 的部分并且就剩下这些了,你不能仅从棋盘上知道它是 1x3 船还是 1x2 船 + 1x1船。
  • @JoelCoehoorn 您无法将1 1 1 1 1 区分为 3x1 和 2x1,或者 1x1 和 4x1。其次,请注意,在 OP 的示例中,有一个 2x2 的正方形 1 字符,这意味着 OP 没有应用“一种船型”的正常规则。
  • @Flater 但是,如果您只是计算船只,那么无论如何,它们仍然是两艘船。但我的评论并不意味着批评。这是一个“这个!,甚至更多!”
【解决方案3】:

鉴于新问题,这对你来说应该足够了:

int count = ships.Cast<int>().Sum();

with a simple search through the internet you would have easily found this though

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多