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问题的任何方面。比赛期间应避免讨论策略,并推迟到比赛结束。这不是一场持续的比赛