本人初学Java,这个算法(呵呵,这个小东西也叫算法的话:我们数据结构老师讲的哦“你们现在学的算法其实都不是算法”)是在做连连看时用到的。
连连中如果把连线规则定义为无限拐点,那么连通这两个节点的工作就和在迷宫中已知起点终点寻路的工作一样了。因此,在写这个算法之前主要参考了两种算法:一种是递归算法,一种是A星寻路算法。不说别的了,先奉上我写的伪码:
public class Node {//把所有的节点包装成一个Node对象,一下为Node中的属性及方法
private String path;//图片路径
private boolean accessible;//节点位置是否为空
private int x;//节点位置信息
private int y;//节点位置信息
private int score;//每个节点的权值
get/set方法略……
}
public boolean sAstar(){
……//获得每个节点是否可通过的信息.简单地,节点上有图片的为不可通过,没有图片的为可通过
……//获得每个节点的得分
//计算得分的规则不惟一,但是所计算出来的得分必须能反映所有节点到终点的距离上的相对大小(这应该是一种估算)
new Stack<Node>();//开启栈
open.push(node1);//把其中一个节点放入开启栈,相当于把这个节点当作迷宫中的起点
new Stack<Node>();// 关闭栈
while (//开启栈不为空) {
j = open.pop();//弹出开启栈顶的节点,称为一个可能的父节点
//因为这种算法找的的路径只有一条,并且关闭栈里最终保存的将是那条最短的路径
……// 清空open栈备待会儿装入周围点
//遍历周围的节点{
if (//正在遍历的节点就是终点){
//returne true:可以连通
} else if (//正在遍历的节点属性为可通过的,并且当前既不在开启栈又不在关闭栈) {
//将正在遍历的节点放入开启栈,以备接下来的判断和排序
}
if (开启栈是空的,也就是会说周围四个点除了有一个可能是来路以外,无路可走了!) {
//当前弹出的那个可能的父节点j节点已经不在可能是父节点了,因此将它的可通行属性设为false
//将刚才放入关闭栈的符节点取出,再压入开启栈
//如果这时关闭栈是空的,那就是说退到起点了,就可以返回false了
}// end if
//将那个可能的父节点放入关闭栈保存起来
//对开启栈排序,确保下次取到的可能父节点为离终点最近的
}// end while
//这个方法中如果可以连通,只有一处可以判断,即上边那个returne true
}
我的整个连连看源码在附件中,不过除了能连无限拐点,以外就没有什么功能了,可以说是一个迷宫了,呵呵<!--StartFragment --> <!--StartFragment -->