深度优先算法(DFS) js Demo

展示效果如下图:

DFS算法就像老鼠走迷宫:朝着一个方向走到不能走,然后转向继续走,若3个方向都是是障碍,那么回到上一个位置转向···,直到找到出口,或者走完所有可能的路未找到出口。深度优先算法属于盲目搜索,无法保证搜索到的路径为最短路径。

算法实现基本思路为:把所有可能的路径看做一个从根节点出发的树形结构,从出发点开始,依次递归考察每个节点的连通性,直到找到终点或者搜索完整棵树。

核心算法:

function Position(x,y,prePOS){
	this.X=x;
	this.Y=y;
	this.PrePOS = prePOS;
}
Position.prototype.validate = function(nextPos){
	//1 在方格范围之内的,2 非障碍物,3 若当前pos的previous pos存在且,next pos不为previous pos
	if( nextPos.X >=0 && nextPos.X < X && nextPos.Y >=0 && nextPos.Y < Y && grid[nextPos.X][nextPos.Y]==1 && !searchedQ.has(nextPos)){
		if( this.PrePOS && nextPos.X == this.PrePOS.X && nextPos.Y == this.PrePOS.Y){
			return false;
		}
		return true;
	}
	return false;
}
Position.prototype.Down = function(){
	var pos = new Position(this.X + 1, this.Y);
	if(this.validate(pos)){
		pos.PrePOS = this;
		return pos;
	}
	return undefined;
};
Position.prototype.Right = function(){
	var pos = new Position(this.X, this.Y + 1);
	if(this.validate(pos)){
		pos.PrePOS = this;
		return pos;
	}
	return undefined;
};
Position.prototype.Up = function(){
	var pos = new Position(this.X - 1, this.Y);
	if(this.validate(pos)){
		pos.PrePOS = this;
		return pos;
	}
	return undefined;
};
Position.prototype.Left = function(){
	var pos =  new Position(this.X, this.Y - 1);
	if(this.validate(pos)){
		pos.PrePOS = this;
		return pos;
	}
	return undefined;
};

function Queue(){
	var me = this;
	var _list = [];
	this.length = function(){
		return _list.length;
	};
	this.push=function(position){
		if(startPos.constructor.name != "Position")
			throw "Should be Position object.";
		_list.push(position);
		return me;
	}
	this.fetch=function(){
		return _list.shift();
	}
	this.pop=function(){
		return _list.pop();
	}
	this.has=function(position){
		for(var i=0,len=_list.length;i


以下为实现代码,仅供参考(算法还需要完善,如果有发现错误,请批评指正,谢谢)







格子长: 格子宽: 



提示:点击格子设置/取消障碍







你可能感兴趣的:(算法,JavaScript)