Algorithm 查找覆盖所有检查点的路径

Algorithm 查找覆盖所有检查点的路径,algorithm,graph,Algorithm,Graph,我有一个大小为2*N数组的矩阵a,每个元素都是*检查点或X危险点,不允许进入危险点 您需要找到是否存在一条路径,该路径覆盖所有检查点而不访问危险点,并且每个点都被访问一次 你可以在任何检查站开始你的旅程 例如: *X** ***X 存在访问所有检查点的路径 我的方法: dfs(int x , int i){ Visted[x][i] = true; if(!Visted[x^1][i] && A[x^1][i] == '*') dfs(i, x^1);

我有一个大小为
2*N
数组的矩阵a,每个元素都是
*
检查点或
X
危险点,不允许进入危险点

您需要找到是否存在一条路径,该路径覆盖所有检查点而不访问危险点,并且每个点都被访问一次

你可以在任何检查站开始你的旅程

例如:

*X**
***X 
存在访问所有检查点的路径

我的方法:

dfs(int x , int i){
  Visted[x][i] = true;
  if(!Visted[x^1][i] && A[x^1][i] == '*')
      dfs(i, x^1);
  else if(i+1 < n && A[x][i] == '*') 
      dfs(i+1,x);
}   
从0到N选择遇到的第一个检查点:

如果您位于索引i且其他数组(A[0]或A[1])包含切点,则切换该数组,如果可能,则不在同一数组中继续

最后检查是否访问了所有检查点

我的方法不是给我正确的答案这里出了什么问题

代码:

dfs(int x , int i){
  Visted[x][i] = true;
  if(!Visted[x^1][i] && A[x^1][i] == '*')
      dfs(i, x^1);
  else if(i+1 < n && A[x][i] == '*') 
      dfs(i+1,x);
}   
dfs(整数x,整数i){
Visted[x][i]=真;
如果(!Visted[x^1][i]&&A[x^1][i]=='*')
dfs(i,x^1);
else如果(i+1
正如您所看到的,一旦选择了初始点,您的算法的解决方案要么是唯一的,要么是不存在的,因为它最多有一个步骤来尝试每个单元格

所以,问题可能在于你没有展示的部分:你如何选择初始点? 使用此算法,您可以尝试这两种情况,并查看结果路径之一是否覆盖每个单元格

这里有两个例子。 在左边,我们必须从第一行开始。 在右边,我们必须从第二行开始

*X    1X                 **    23
**    23                 *X    1X

“每个点访问一次”的含义并不完全清楚。这应该是“每个点访问不超过一次”@n.m.也许它的意思是“恰好一次”。@n.m.每个点应该恰好访问一次如果您需要访问所有点恰好一次,那么您不清楚如何避免危险点,或者检查点的意义是什么。“所有点”是指所有点,包括危险点和检查点。@n.m.我选择(0,n)之间的第一个检查点遭遇,并根据发生的数组调用
DFS(I,0)或DFS(I,1)
,然后从该点查找路径以检查是否收集或删除了所有检查点not@JohnySins可能是对的,,但是没有上下文很难说。例如,x的范围是多少,n是多少,坐标是从零开始还是从一开始,函数最初是如何调用的。这就是a要解决的问题。我的算法在两个测试用例上都是正确的。。不知道怎么了?@JohnySins如果你需要更多的帮助,你可能想发布一个完整的程序,而不仅仅是一个没有足够上下文的函数。举一个不起作用的例子——如果你有它的话——也会有帮助。@JohnySins你可能想重温Codechef,这是你在注册比赛时同意的。特别是:在任何其他平台上进行的在线或离线比赛中,不要询问或讨论任何CodeChefs问题的任何方面。比赛期间应避免讨论策略,并推迟到比赛结束。这不是一场持续的比赛