我正在尝试在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;
}