下图是求骑士旅行的路径的主要代码,每次都是陷入到无限循环的情况,查BUG两天了,实在没办法才求助大神

一个昵称而已T 2015-09-05 07:10:04
我是把8*8的棋盘看作一个图,每个格子就是一个结点,List<List<Integer>> newNeighbors里的每一个newNeighbors.get(i)存储了所有符合从格子i到下一个格子要求的格子,并且按结点的度排序了

public List<Integer> getHamiltonianPath(int v) {
int[] next=new int[getSize()];
for(int i=0;i<next.length;i++)
next[i]=-1;
boolean[] isVisited=new boolean[getSize()];
List<Integer> result=null;
List<List<Integer>> newNeighbors=deepClone(neighbors);
for(int i=0;i<getSize();i++)
reorderNeigborsBaseOnDegree(newNeighbors.get(i));
if(getHamiltonianPath(v,next,isVisited,newNeighbors)); {
result=new ArrayList<Integer>();
int vertex=v;
while(vertex!=-1) {
result.add(vertex);
vertex=next[vertex];
}
}
return result;
}

private boolean getHamiltonianPath(int v, int[] next, boolean[] isVisited,List<List<Integer>> newNeighbors) {
isVisited[v] = true;
if (allVisited(isVisited))
return true;
for (int i = 0; i < newNeighbors.get(v).size(); i++) {
int u = newNeighbors.get(v).get(i);
if (!isVisited[u]&& getHamiltonianPath(u, next, isVisited, newNeighbors)) {
next[v] = u;
return true;
}
}
isVisited[v] = false;
return false;
}

private boolean allVisited(boolean[] isVisited) {
for(boolean i:isVisited)
if(i==false) return false;

return true;
}
...全文
103 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony4geek 2015-09-06
  • 打赏
  • 举报
回复
自己去调试啊,getHamiltonianPath ,看看循环跳出的地方是哪里。

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧