📄 readme.txt
字号:
尚老师暂时我还没作出来扩展节点的显示,我先把这个发过来吧,
我尽量把扩展节点显示出来,有的地方我还没想明白,如果做出来,我再发过去。
你让我做的一些JAVA小程序,我整理一下,下周给您发过去。
说明:
本程序在JBuilder环境下运行
EightFigure 问题程序由四部分组成:
Frame1.java 显示初始界面 ,初始化,调用searchProcess和Frame2
Frame2.java 显示运行结果界面
mainProcess.java 系统自动生成的程序运行的入口,运行时右键点击此处运行
searchProcess.java 系统主要的执行过程,为本程序的主要部分。
searchProcess.java 程序的关键原码如下:
public class searchProcess {
public Vector open=new Vector();
public Vector close=new Vector();
public int pnodeId=0;
public Vector execute(int[][] Source,int[][] Dest){
boolean flag;
Node source=new Node(0,0,Source,0,0,0);
Node dest=new Node(0,0,Dest,0,0,0);
source.h=caculatemove(source,dest);
source.f=source.g+source.h;
push(source,open);
Node pnode=source;
while(flag=true){ //OPEN表为空退出
if(open.isEmpty()){
flag=false;
break;
}
pnode=pop(open);
push(pnode,close);
if (judgesame(pnode, dest)) //找到目标退出
break;
extendnode(pnode,dest);
queopen();
}
Node Father; //根据父节点找最佳路径
Vector Result=new Vector();
int k=0;
if(flag=true){
Result.add(pnode);
int m=pnode.parentid;
while(m>0){
Father=found(m,close,source);
m=Father.parentid;
Result.add(Father);
k++;
}
}
else{ //没找到标志
System.out.print("no found");
}
Result.add(source);
return Result; //即为结果
}
//////////////////////////////////////
//以下是EXECUTE实现的所有方法:
public void push(Node node,Vector ope){ //将NODE加进OPEN表
ope.add(node);
}
public Node pop(Vector ope){ //将OPEN表的第一个NODE弹出
Node firstnode=(Node)ope.get(0);
ope.removeElementAt(0);
return firstnode;
}
public Node found(int k,Vector vec,Node Source){ //在CLOSE表中ID号相同的NODE
Node result=Source;
int i;
for(i=0;i<vec.size();i++){
if(k==((Node)vec.get(i)).Id)
{
result=(Node)vec.get(i);
}
}
return result;
}
public boolean judgesame(Node s1,Node s2){ //判断找到的NODE是否是目标NODE
int[][] arr=new int[3][3];
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
if(!(s1.arr[i][j]==s2.arr[i][j]))
return false;
}
}
return true;
}
public void extendnode(Node pnode,Node des){ //将OPEN表中第一个NODE 扩展
int m=0;
int n=0;
//将NODE的“0”定位M,N
for(int i=0;i<=2;i++)
{ for(int j=0;j<=2;j++)
if(pnode.arr[i][j]==0)
{
m=i;
n=j;
}
}
//以下分四个方向扩展:上、下、左、右,并加入OPEN表中
if(m-1>-1)
{ int[][] arr=new int[3][3];
boolean flag=true;
Node pnewnode=new Node(0,0,arr,0,0,0);
for(int i=0;i<=2;i++)
for( int j=0;j<=2;j++)
pnewnode.arr[i][j]=pnode.arr[i][j];
pnewnode.arr[m][n]=pnewnode.arr[m-1][n];
pnewnode.arr[m-1][n]=0;
int k=0;
while(k<close.size())
{
flag=true;
for(int ii=0;ii<=2;ii++)
{
for( int jj=0;jj<=2;jj++)
if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
{flag=false;
break;
}
if(flag==false) break;
}
if(flag==true) break;
k++;
}
if(flag==false)
{
pnewnode.parentid=pnode.Id;
pnodeId=pnodeId+1;
pnewnode.Id=pnodeId;
pnewnode.g=pnode.g+1;
pnewnode.h=caculatemove(pnewnode,des);
pnewnode.f=pnewnode.g+pnewnode.h;
open.add(pnewnode);
}
}
if(m+1<3)
{ int[][] arr=new int[3][3];
boolean flag=false;
Node pnewnode=new Node(0,0,arr,0,0,0);
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
pnewnode.arr[i][j]=pnode.arr[i][j];
pnewnode.arr[m][n]=pnewnode.arr[m+1][n];
pnewnode.arr[m+1][n]=0;
int k=0;
while(k<close.size())
{
flag=true;
for(int ii=0;ii<=2;ii++)
{
for( int jj=0;jj<=2;jj++)
if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
{flag=false;
break;
}
if(flag==false) break;
}
if(flag==true) break;
k++;
}
if(flag==false)
{
pnewnode.parentid=pnode.Id;
pnodeId=pnodeId+1;
pnewnode.Id=pnodeId;
pnewnode.g=pnode.g+1;
pnewnode.h=caculatemove(pnewnode,des);
pnewnode.f=pnewnode.g+pnewnode.h;
open.add(pnewnode);
}
}
if(n-1>-1)
{ int[][] arr=new int[3][3];
boolean flag=false;
Node pnewnode=new Node(0,0,arr,0,0,0);
for( int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
pnewnode.arr[i][j]=pnode.arr[i][j];
pnewnode.arr[m][n]=pnewnode.arr[m][n-1];
pnewnode.arr[m][n-1]=0;
int k=0;
while(k<close.size())
{
flag=true;
for(int ii=0;ii<=2;ii++)
{
for( int jj=0;jj<=2;jj++)
if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
{flag=false;
break;
}
if(flag==false) break;
}
if(flag==true) break;
k++;
}
if(flag==false){
pnewnode.parentid=pnode.Id;
pnodeId=pnodeId+1;
pnewnode.Id=pnodeId;
pnewnode.g=pnode.g+1;
pnewnode.h=caculatemove(pnewnode,des);
pnewnode.f=pnewnode.g+pnewnode.h;
open.add(pnewnode);
}
}
if(n+1<3)
{ int[][] arr=new int[3][3];
boolean flag=false;
Node pnewnode=new Node(0,0,arr,0,0,0);
for( int i=0;i<=2;i++)
for( int j=0;j<=2;j++)
pnewnode.arr[i][j]=pnode.arr[i][j];
pnewnode.arr[m][n]=pnewnode.arr[m][n+1];
pnewnode.arr[m][n+1]=0;
int k=0;
while(k<close.size())
{
flag=true;
for(int ii=0;ii<=2;ii++)
{
for( int jj=0;jj<=2;jj++)
if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
{flag=false;
break;
}
if(flag==false) break;
}
if(flag==true) break;
k++;
}
if(flag==false)
{
pnewnode.parentid=pnode.Id;
pnodeId=pnodeId+1;
pnewnode.Id=pnodeId;
pnewnode.g=pnode.g+1;
pnewnode.h=caculatemove(pnewnode,des);
pnewnode.f=pnewnode.g+pnewnode.h;
open.add(pnewnode);
}
}
}
public void queopen(){ //OPEN表排序,只用找F值最小的设为第一个NODE
int indexmin=0;
int[][] arr=new int[3][3];
Node temp=new Node(0,0,arr,0,0,0);
Node node0=(Node)open.get(0);
int minvalue=node0.f;
for(int i=0;i<open.size();i++){
Node opei=(Node)open.get(i);
// int minvalue=(Node)open.get(i
if(opei.f<minvalue)
{
minvalue=opei.f;
indexmin=i;
}
}
temp=(Node)open.get(0);
open.setElementAt((Node)open.elementAt(indexmin),0);
open.setElementAt(temp,indexmin);
}
public int caculatemove(Node nod,Node destin){ //计算NODE到目标NODE 需要走的步数,即为H值
int totalstep=0;
int i,j,k,l,value;
int row=0;
int col=0;
int step=0;
for( i=0;i<=2;i++){
for( j=0;j<=2;j++)
{
value=nod.arr[i][j];
int t=1;
for( k=0;k<=2;k++)
{
for( l=0;l<=2;l++) {
if(value==destin.arr[k][l]) {
t=0;
row=k;
col=l;
break;
}
}
if(t==0)
{
break;
}
}
step=abs(i-row)+abs(j-col);
if (value!=0)
totalstep+=step;
}
}
return totalstep;
}
public int abs(int num) //取一个数的绝对值
{
int nume;
if(num>0)
nume=num;
else
nume=-num;
return nume;
}
}
class Node { //定义NODE 结构
int Id;
int[][] arr=new int[3][3];
int parentid;
int g;
int f;
int h;
public Node()
{}
public Node(int Id,int parentid,int[][] arr,int f,int g,int h) {
this.Id=Id;
this.parentid=parentid;
for(int i=0;i<=2;i++)
{for(int j=0;j<=2;j++)
this.arr[i][j]=arr[i][j];
}
this.f=f;
this.g=g;
this.h=h;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -