【问题标题】:C# Domino function that takes undetermined amount of domino tiles as inputC# Domino 函数将不确定数量的多米诺瓷砖作为输入
【发布时间】:2015-06-28 09:57:38
【问题描述】:

我真的付出了很多努力来了解如何解决这个问题,但不幸的是我仍然错过了一些东西,这就是我无法解决这个问题的原因。问题是: 编写一个函数,将未确定数量的多米诺骨牌作为输入,并确定您是否可以将它们排成一行,并且只有匹配的数字并排。可能返回真,否则返回假。 每张多米诺骨牌都有两侧,编号为 0-6,如下图所示。
示例 A: [2,2]、[2,3]、[3,6].. 这种情况下返回 true。
示例 B:[3,1]、[1,5]、[3,6].. 这种情况下返回 false。

详细说明:多米诺瓦片的数量以以下格式作为函数的输入,使用上面的示例:[[2,2], [2,3],[3,6]]

这是他们开始推荐功能的方式:

public bool dominos(long[,] arr1,  long dim_1, long dim_2){    
}

【问题讨论】:

  • 我删除了标签“lotus-domino”,因为它与 IBM 的 Notes Domino 无关。
  • 是的,我的意思是多米诺骨牌,谢谢
  • 我连例子二都看不懂:多米诺牌可以翻转,所以很容易解决为(6,3)(3,1)(1,5)。跨度>

标签: c# console tiles


【解决方案1】:

基本上,您似乎想要某种对象来表示您的 Domino 瓷砖。它应该有 2 个值,并且可能是左/右的指示。

从那里开始,进行递归调用来检查您是否拿走了第一个图块,是否可以将其余部分放在它后面,如果没有,交换它,然后再试一次,这是一件微不足道的事情。如果可以,则返回成功,如果不能,则返回失败。

每一步,你基本上都会说,采取一个,尝试其余的。所以最后一步将获得 1 个图块,并返回 true,然后从那里开始,取决于您拥有的图块。

【讨论】:

    【解决方案2】:

    我会用递归搜索来解决这个问题——编写一个函数来遍历所有允许的多米诺瓦片组合。 这样,您将获得任何一组瓷砖的精确解决方案,尽管效率不高。然后您可以开始寻找更快的算法,但我不确定是否存在更快的方法来确定您的问题的答案,或者是否与您在比指数时间更快的时间内找到解决方案相关。

    搜索所有解决方案的伪代码如下):

    bool dominos(int[,] current, int[,] left)
    {
      if (left.Length == 0) {
         Console.Writeln(solution = current);
         return true;
      } else {
         bool result = false;
         foreach(next in left.Where(tile matches ending of current path)) {
             result = result || dominos(current with appended next, left without next)
             if (result)
                 break;
         }
      }
    }
    

    【讨论】:

      【解决方案3】:

      您只需计算每个数字出现的频率。

      如果两个或更少的数字有奇数则返回true,否则返回false..

      删除所有在计数之前在任何其他瓷砖上的数字的双打!

      为空列表返回 false!

      【讨论】:

      • 这会在 [ [3,3], [5,5] ] 上失败。
      • 是的,我有它但删除了它,现在它又回来了;-)
      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2011-09-03
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多