哈密​​顿路径算法将C ++代码转换为C#

时间:2019-02-06 19:46:13

标签: algorithm hamiltonian-path

我正在尝试在C#中的this link处复制本教程的第2部分。我已经编写了代码,并且可以编译,但是该函数始终返回false。对于此问题,我填充了四个节点,这些节点以2x2的网格模式排列。这些节点分别连接到其右侧,左侧,上侧或下侧的节点,每个节点都表示为arr [i] [j],其中“ i”是行,“ j”是列。

代码如下:

static int length = 2;
    static int MAXN = length * length;


    static void Main(string[] args)
    {
        var arr = InitArray();
        bool check = CheckUsingDP(arr, length);
    }


    public static int[,] InitArray()
    {
        var n = length;
        var arr = new int[n * n, n * n];

        for (var j = 0; j < n * n; j++)
        {
            for (var i = 0; i < n * n; i++)
            {
                if (arr[i, j] != 1 && i != j)
                {
                    arr[i, j] = 0;
                    if (i > 0 && (i % n - j % n == 0 || (Math.Abs(i % n - j % n) == 1 && i / n == j / n)) && Math.Abs(i - j) <= n)
                    {
                        arr[i, j] = 1;
                        arr[j, i] = 1;
                    }
                    if (j > 0 && (j % n - i % n == 0 || (Math.Abs(i % n - j % n) == 1 && i / n == j / n)) && Math.Abs(i - j) <= n)
                    {
                        arr[i, j] = 1;
                        arr[j, i] = 1;
                    }
                }
            }
        }

        return arr;
    }

    static bool CheckUsingDP(int[,] adj, int n)
    {

        bool[,] dp = new bool[MAXN, 1 << MAXN];
        for (int i = 0; i < n; i++)
            dp[i, 1 << i] = true;
        for (int i = 0; i < (1 << n); i++)
        {
            for (int j = 0; j < n; j++)
                if ((i & (1 << j)) == 1)
                {
                    for (int k = 0; k < n; k++)
                        if (((i & (1 << k)) == 1) && adj[k, j] == 1 && k != j && dp[k, i ^ (1 << j)])
                        {
                            dp[j, i] = true;
                            break;
                        }
                }
        }
        for (int i = 0; i < n; i++)
            if (dp[i, (1 << n) - 1])
                return true;

        return false;
    }

0 个答案:

没有答案