给定一个带有n²个路径节点的图形,并且假设起始节点总是在右上角(点A)而结束节点总是在右下角(点B),我需要编写一个C#程序将确定给定n的从A到B的哈密顿路径的数量(假设n <= 10)。换句话说,我需要找到从A开始并在B结束的每条路径,其中每个节点只访问一次,并且节点之间的移动被限制为左,右,上,下(无对角线)。
例如,如果n = 5,那么一个可能的路径将是此图像中显示的路径:
理想情况下,我想开发一种利用一些启发式算法的智能算法,但是现在我只需要开发一种强力方法。我假设我使用广度优先搜索,但我真的不知道从哪里开始实现使用C#。
答案 0 :(得分:0)
一些暴力的事情
构建图表。 构建Graph runner。 缓存所有Runinformation。 让跑步者重新运行图表并从Runinformation中排除所有决策。 当跑步者不再运行时,过滤缓存的数据并计算结果。
用C#实现
安装像nunit这样的测试框架。 写下你需要的功能列表。
重复,直到featurelist为空:
完成
编辑回答评论中的一些问题
以下是该计划:
using System;
using NUnit.Framework;
namespace EC_Connect_Test
{
class Program
{
[STAThread]
static void Main(string[] args)
{
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(Program)).Location;
NUnit.Gui.AppEntry.Main(new string[] { fullPath });
}
}
public class MathClass
{
internal static double Divide(int A, int B)
{
if (B == 0) throw new DivideByZeroException();
return (Double)A / (Double)B;
}
}
[TestFixture]
class MyFirstTestClass
{
[Test]
public void DividingTwoIntegersResultIsDouble()
{
Double expected = 3.3;
Double actual = MathClass.Divide(33, 10);
Assert.AreEqual(expected, actual);
}
[Test]
public void DividingByZeroShouldThrow()
{
Assert.Throws<DivideByZeroException>(
() => { MathClass.Divide(33, 0); }
);
}
}
}
您也可以从外部启动Nunit,并将您的debugproject作为目录提供。这样就不会出现异常情况,测试变得更容易。
功能列表就是您希望软件执行的操作。在您的情况下,您将以某种形式提供给定的图表。那可能是一个文件或一张纸。因此,一个功能是加载该信息并从中创建图表。你提到的下一个功能是你的程序应检查n&lt; = 10并拒绝工作,如果不是这样,那也是一个功能。另一个是通过给定的接口返回结果。最后一点也就是实际找到所有连接的能力。如果你自己列出这些,你可以选择你认为最容易的那个,并从那个开始。
测试时不要忘记为已知案例创建端到端测试。所以固定图形,已知编号。
使用狂野的假设你的图形在文本文件中,其中每一行列出了与其他行的连接,你可以编写如下的测试:
[TestFixture]
class graphloadingSpex
{
String[] lines = new String[] {
"2,3,4",
"1",
"1,4",
"1,3"
};
[Test]
public void ShouldShowConnectionsAfterLoading()
{
Graph tested = new Graph(lines);
Assert.AreEqual(new String[] { "2", "3", "4" }, tested["1"].GetConnextions());
Assert.AreEqual(new String[] { "1"}, tested["2"].GetConnextions());
Assert.AreEqual(new String[] { "1", "4" }, tested["3"].GetConnextions());
Assert.AreEqual(new String[] { "1", "3" }, tested["4"].GetConnextions());
}
}
由于Graph尚不存在,因此无法编译。但是让它编译并进行测试通过将满足您的第一个功能,您可以通过首先编写测试来继续实现下一个功能。