C#Domino函数,该函数将未确定数量的Domino瓦片作为输入

本文关键字:函数 Domino 输入 未确定 C#Domino | 更新日期: 2023-09-27 18:00:03

我真的付出了很多努力来理解如何解决这个问题,但不幸的是,我仍然错过了一些东西,这就是我无法解决这个问题的原因。问题是:编写一个函数,以未确定数量的domino瓦片作为输入,并确定是否可以将它们并排放置在只有匹配数字的行中。返回true of it is possible,否则返回false。每张多米诺骨牌都有两面,数字为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){    
}

C#Domino函数,该函数将未确定数量的Domino瓦片作为输入

基本上,您似乎希望使用某种对象来表示Domino瓦片。它应该具有2个值,并且可能指示左/右。

从那时起,有一个递归调用来检查你是否获得了第一个瓦片,你能把剩下的放在后面吗,如果不能,交换它,然后再试一次,这是一件微不足道的事情。如果可以,就返回成功;如果不能,就返回失败。

每一步,你基本上都会说,迈出一步,试试剩下的。所以最后一步会得到1个瓦片,然后返回true,从那以后,就取决于你拥有的瓦片了。

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

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

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;
     }
  }
}

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

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

在计数之前删除任何其他磁贴上的所有带数字的双打!

对于空列表,返回false!