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){
}
基本上,您似乎希望使用某种对象来表示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!