javascript设计模式交流(2)

最后是finish函数 在beam的基础上修改一下就可以了 我们可以通过finish检查,来决定求一个可行 解、求所有解、还是对解计数,下面的finish是求出并打印所有解。

Code:

function finishQueen(){    if(this.depth<this.size)return false;    x=this.pos;y=this.depth-1;    while(--x>=0&&--y>=0)        if(this[y][x]!=0)return false;    x=this.pos;y=this.depth-1;    while(--y>=0)        if(this[y][x]!=0)return false;    x=this.pos;y=this.depth-1;    while(--y>=0&&++x<this.size)    {        if(this[y][x]!=0)return false;    }    document.write(this+"\n");    return false;}

有了这三个函数之后,就可以定义一个BFSQueen类,使它继承Queen类并实现 BreadthFirstSearch接口定义如下

Code:

function BFSQueen(n){    var ret=new Queen(n);    var BFS=new BreadthFirstSearch(extendQueen,beamQueen,finishQueen);    BFS.apply(ret);    return ret;}

下面是完整的八皇后问题代码,在我的电脑上大约跑了30秒 用FF的话只需要一半的 时间

<pre style="font-family:宋体;"><script>function Queen(n){	var ret=new Array();	ret.size=n;								//皇后问题的规模	ret.depth=0;								//搜索的深度	ret.pos=0;								//新皇后的水平位置	for(var y=0;y<n;y++)	{		ret.push([]);		for(var x=0;x<n;x++)			ret[ret.length-1].push(0);	}	function objectPrototypeClone()	{		var tmp=function(){};		tmp.prototype=this;		return new tmp;	}	ret.clone=function(){		var r=objectPrototypeClone.call(this);		for(var i=0;i<n;i++)		{			r[i]=objectPrototypeClone.call(this[i])		}		return r;	}	ret.toString=function(){		var str="";		for(var y=0;y<n;y++)		{			for(var x=0;x<n;x++)				str+=this[y][x]==0?"○":"★";			str+="\n";		}		return str;	}	return ret;}function extendQueen(){	var ret=new Array();	if(this.depth==this.size)return ret;	for(var i=0;i<this.size;i++)	{		var current=this.clone();		//alert(current.depth);		current[current.depth][i]=1;		current.pos=i;		current.depth++;		ret.push(current);	}	return ret;}function beamQueen(){	var x,y;	if(this.depth==0)return false;	if(this.depth==this.size)return true;	x=this.pos;y=this.depth-1;	while(--x>=0&&--y>=0)		if(this[y][x]!=0)return true;	x=this.pos;y=this.depth-1;	while(--y>=0)		if(this[y][x]!=0)return true;	x=this.pos;y=this.depth-1;	while(--y>=0&&++x<this.size)	{		if(this[y][x]!=0)return true;	}	return false;}function finishQueen(){	if(this.depth<this.size)return false;	x=this.pos;y=this.depth-1;	while(--x>=0&&--y>=0)		if(this[y][x]!=0)return false;	x=this.pos;y=this.depth-1;	while(--y>=0)		if(this[y][x]!=0)return false;	x=this.pos;y=this.depth-1;	while(--y>=0&&++x<this.size)	{		if(this[y][x]!=0)return false;	}	document.write(++count+".\n"+this);	return false;}function BreadthFirstSearch(extend,beam,finish){	return function(){		this.finish=finish;		this.extend=extend;		this.beam=beam;		this.search=function(){			var queue=[this];			while(queue.length)			{				var current=queue.shift();				if(!current.beam()){					var extended=current.extend();					for(var i=0;i<extended.length;i++)					{						if(extended[i].finish())return extended[i];						queue.push(extended[i]);					}				}			}			return null;		}	}}function BFSQueen(n){	var ret=new Queen(n);	var BFS=new BreadthFirstSearch(extendQueen,beamQueen,finishQueen);	BFS.apply(ret);	return ret;}var queen=new BFSQueen(8);var count=0;queen.search();</script></pre>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, 设计模式
, this
, while
, false
, 求大神解
, finish
求 解
javascript设计模式、javascript的设计模式、交流充电模式2连接线、javascript交流群、设计模式之禅第2版pdf,以便于您获取更多的相关知识。

时间: 2024-08-30 01:48:48

javascript设计模式交流(2)的相关文章

javascript设计模式交流(一) :Singleton Pattern

javascript|设计  即使是简单的脚本语言,应用良好的模式可以得到非常"优美"的代码和较高的效率.尤其是对于交互要求较高的B/S系统,非常有必要用设计模式来优化代码. 单件模式(Singleton Pattern)是一种非常基本和重要的创建型模式."单件"的职责是保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计过程中,有很多情况下需要确保一个类只能有一个实例. 传统的编程语言中为了使一个类只有一个实例,最容易的方法是在类中嵌入静态变量,并

javascript设计模式交流(1)

本文将讨论Prototype Pattern的js实现,之后讨论javascript的prototype继承和Prototype Pattern的关系. Prototype Pattern是一种创建型模式,在GoF Book中它的意图被描述成用原型 实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Prototype Pattern本身实际上 非常简单,任何一个提供了clone()方法的对象都可以成为原型对象,所有通过它复制的对象都属于一类 对象.在静态语言中,这一模式被用于运行时指定对

JavaScript设计模式之观察者模式

设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切图.做少量交互效果的FE甚至可能不会用到,但是当你开始使用Angular/Backbone等框架的时候,就无法避免设计模式.MVC/MVVM这些东西了(反正我是伤脑筋). 我学设计模式是刚开始接触编程大概三个月的时候,看一本书<大话设计模式>,里面用C#语言来写,我很无语,因为强类型的编程语言对于

JavaScript设计模式系列之原型模式

prototype模式通过实例对象指定需要创建的类型,这与factory method模式有本质不同,factory method模式是通过类的继承定义不同子类来达到创建不同类型对象的目的,属于类模式,prototype模式通过调用组合的对象成员生成不同类型的对象实例,属于对象模式. 由于这个特性,prototype具有以下适用场合: · 需要运行时确定实例化的类时,比如动态装载库时 · 避免创建过多子类时.子类太多永远是不受欢迎的,在factory method中我们也提到通过模板或者参数化来

javascript设计模式:JavaScript设计模式学习一之接口

看完了<JavaScript王者归来>,在图书馆找了<JavaScript设计模式>来看,之前设计模式方面的书看过:<Head First 设计模式>.<设计模式之禅>,GOF的<Design Patterns: Elements of Reusable Object-Oriented Software>看了一部分.记得以前没这些基础的时候,看<JavaScript设计模式>简直是不知道作者在说什么.言归正传:准确的说,JavaScr

JavaScript设计模式学习之“类式继承”

 这篇文章主要介绍了JavaScript设计模式学习之"类式继承",本文直接用代码实例讲解类式继承的实现方法,需要的朋友可以参考下     在做一件事情之前,首先要清楚做这件事情的好处有什么,相信不会有哪个人愿意无缘无故的去做事情.一般说来,我们在设计类的时候,实际上就是希望能减少重复性的代码,使用继承可以完美的做到这一点,借助继承机制,你可以在现有类的基础上再次进行设计并且充分利用它们已经具备的各种方法,而对设计的修改也更为轻松.废话不多说了,举例说明: 代码如下: function

Javascript设计模式之观察者模式的多个实现版本实例

 这篇文章主要介绍了Javascript设计模式之观察者模式的多个实现版本实例,本文给出3种实现版本代码,同时给出了Jquery实现版本,需要的朋友可以参考下     介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己. 使用观察者模式的好处: 1.支持简单的广播通信,自动通知所有已经订阅过的对象. 2.页面载入后目标对象很容易与观

javascript设计模式中的工厂模式示例

 这篇文章主要介绍了javascript设计模式中的工厂模式示例讲解,需要的朋友可以参考下 javaScript工厂方式原始的方式   因为对象的属性可以在对象创建后动态定义,这在 JavaScript 最初引入时都会编写类似下面的代码   代码如下: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() {   alert(this.

《JavaScript设计模式》——导读

前言 JavaScript设计模式 设计模式是解决软件设计中常见问题的可复用方案.探索任何编程语言时,设计模式都是一个令人兴奋和极具吸引力的话题. 原因之一是:设计模式是许多先前开发人员总结出的经验,我们可以借鉴这些经验进行编程,以确保能够以优化的方式组织代码,为我们解决棘手的问题提供参考. 设计模式还是我们用来描述解决方案的常用词汇.当我们想要向其他人表述一种以代码形式构建解决方案的方式时,描述设计模式比描述语法和语义要简单得多. 在本书中,我们将探讨JavaScript编程语言中经典的与现代