Algorithm DSF BFS和带有8ball实现的*搜索任务

Algorithm DSF BFS和带有8ball实现的*搜索任务,algorithm,sorting,depth-first-search,breadth-first-search,Algorithm,Sorting,Depth First Search,Breadth First Search,我正在尝试使用dfs、bfs和A*搜索来解决这个任务,目前我完全是堆栈。任务如下: 有4个黑球和4个白球,黑球、白球、黑球、白球依次排列。还有两个空的地方排成一行。球需要重新排列,以得到4黑4白的结果。只能移动两个位于一起的球。例如,想象1-黑球,0-白球 1010 u1010 101011--0 _u1010 我无法在脑海中想象和构建图表,任何建议都是值得赞赏的我用Java编写了以下代码。有两种状态“黑、白、空”。我还描述并添加了球所在的线。我认为它将在DFS原则下工作。有人能告诉我是对的吗?

我正在尝试使用dfs、bfs和A*搜索来解决这个任务,目前我完全是堆栈。任务如下: 有4个黑球和4个白球,黑球、白球、黑球、白球依次排列。还有两个空的地方排成一行。球需要重新排列,以得到4黑4白的结果。只能移动两个位于一起的球。例如,想象1-黑球,0-白球

1010 u1010

101011--0

_u1010


我无法在脑海中想象和构建图表,任何建议都是值得赞赏的

我用Java编写了以下代码。有两种状态“黑、白、空”。我还描述并添加了球所在的线。我认为它将在DFS原则下工作。有人能告诉我是对的吗?代码是否遵循DFS

import java.util.ArrayList;
导入java.util.List;
公共类DepthFirstSearch{
私有列表顶点列表=新的ArrayList(10);
私有顶点v1=Vertex.build(1,State.BLACK);
私有顶点v2=Vertex.build(2,State.WHITE);
私有顶点v3=Vertex.build(3,State.BLACK);
私有顶点v4=顶点.build(4,State.WHITE);
私有顶点v5=Vertex.build(5,State.EMPTY);
私有顶点v6=Vertex.build(6,State.EMPTY);
私有顶点v7=顶点.build(7,State.BLACK);
私有顶点v8=Vertex.build(8,State.WHITE);
私有顶点v9=Vertex.build(9,State.BLACK);
私有顶点v10=Vertex.build(10,State.WHITE);
公共部门优先搜索(){
v2.setParentVertex(v1);
v3.setParentVertex(v2);
v4.setParentVertex(v3);
v5.setParentVertex(v4);
v6.setParentVertex(v5);
v7.setParentVertex(v6);
v8.setParentVertex(v7);
v9.setParentVertex(v8);
v10.setParentVertex(v9);
v1.setChildVertex(v2);
v2.setChildVertex(v3);
v3.setChildVertex(v4);
v4.setChildVertex(v5);
v5.setChildVertex(v6);
v6.setChildVertex(v7);
v7.setChildVertex(v8);
v8.setChildVertex(v9);
v9.setChildVertex(v10);
vertexList.add(v1);
vertexList.add(v2);
添加(v3);
vertexList.add(v4);
vertexList.add(v5);
vertexList.add(v6);
vertexList.add(v7);
vertexList.add(v8);
vertexList.add(v9);
vertexList.add(v10);
}
私家车{
打印顶点(v1);
而(!isFinalResult()){
搜索(v1);
}
}
专用空心搜索(顶点){
如果(isFirstEmpty(顶点)){
State prevState=vertex.getParentVertex().getState();
顶点mVertex=null;
用于(顶点v:顶点列表){
if(hasPrevState(v,prevState)){
mVertex=v;
打破
}
}
State pState=mVertex.getState();
State cState=mVertex.getChildVertex().getState();
mVertex.setState(vertex.getState());
mVertex.getChildVertex().setState(vertex.getChildVertex().getState());
顶点设置状态(pState);
vertex.getChildVertex().setState(cState);
findFinal(v1);
System.out.println(“==============================================”);
打印顶点(v1);
}否则{
搜索(vertex.getChildVertex());
}
}
私有布尔值isFirstEmpty(顶点){
返回vertex.getState()==State.EMPTY&&vertex.getChildVertex().getState()==State.EMPTY;
}
私有布尔状态(顶点、顶点、状态状态){
return!vertex.isFinal()&&vertex.getState()==state&&vertex.getChildVertex().getState()!=state.EMPTY;
}
私有void findFinal(顶点){
最终顶点childVertex=Vertex.getChildVertex();
if(vertex.isFinal()){
findFinal(vertex.getChildVertex());
}else if(vertex.getState()==State.BLACK&&childVertex!=null&&childVertex.getState()==State.BLACK){
vertex.setFinal(true);
findFinal(vertex.getChildVertex());
}否则{
返回;
}
}
私有空心打印顶点(顶点){
如果(顶点!=null){
System.out.println(顶点);
printVertex(vertex.getChildVertex());
}
}
私有布尔值isFinalResult(){
布尔bResult=v1.getState()==State.BLACK;
bResult&=v2.getState()==State.BLACK;
bResult&=v3.getState()==State.BLACK;
bResult&=v4.getState()==State.BLACK;
bResult&=v5.getState()==State.WHITE;
bResult&=v6.getState()==State.WHITE;
bResult&=v7.getState()==State.WHITE;
bResult&=v8.getState()==State.WHITE;
返回结果;
}
公共静态void main(字符串[]args){
DepthFirstSearch=新的DepthFirstSearch();
search.run();
}
}

您描述的配置定义了一种状态。你可以在图形中考虑每个状态的顶点。你在两个状态之间有一个优势,就是有一个简单的移动,你可以应用到第一个状态,达到第二个状态。这是你的图表


现在,寻找解决方案意味着在对应于初始状态和所需状态的顶点之间找到一条路径,您可以应用DFS、BFS、a*或任何您想要的图形算法。

如果您问的是一个理论问题(即,鉴于这个问题,我如何将其表示为图形),那么您在错误的站点上提出了问题,使用computerscience.SE。如果您不能编写一个程序来实现这些算法,那么代码编写服务也不能。有大量的资料和python实现,看看这些,当您尝试一些东西时,打开一个包含您的代码的问题,并询问您遇到的具体问题