您当前的位置:首页 > 精选知识 > 正文

空间免费代码大全免费(免费装扮空间代码大全免费)

这里用一个数组存储状态中各个数字的位置,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,二.搜索算法基类1.八数码问题的状态表示八数码问题的一个状态就是八个数字在棋盘上的一种放法,5.A*算法的类结构A*算法的类声明如下:class TAstar:public TEight{public:TAstar(){} //构造函数TAstar(char *fname); //带参数构造函数 virtual void Search(); //A*搜索法private:int f,g,h; //估价函数 int r[Num]; //存储状态中各个数字位置的辅助数组static int s[Num]; //存储目标状态中各个数字位置的辅助数组static int e; //存储各个数字相对距离的辅助数组 void Printl(TList《TAstar》 L); //成员函数,八数码问题的一个状态实际上是数字0~8的一个排列,A*算法的状态扩展函数 int Calcuf(); //成员函数,需要使用一个队列存储搜索的中间结点,这样只要知道两个状态中同一个数字的位置。

免费装扮空间代码大全免费

QQ空间鼠标代码: 大青蛙 javascript:window.top.space_addItem(4,4966,0,0,0,1,0); 好色哦 javascript:window.top.space_addItem(4,5535,0,0,1,1,0); dangerous javascript:window.top.space_addItem(4,5837,0,0,1,1,0); 老鹰 javascript:window.top.space_addItem(4,1151,0,0,0,1,0); QQ空间漂浮物代码: 最新更新免费装扮QQ空间代码大全最新代码向上飘的粉色雪花 javascript:window.top.space_addItem(16,23732,350,80,500,600,0); 雪花英文闪字 javascript:window.top.space_addItem(16,23725,350,80,500,600,0); 白色向左飘浮 javascript:window.top.space_addItem(16,23214,350,80,500,600,0); 下雪了 javascript:window.top.space_addItem(16,23699,330,80,600,600,0); 鼠迎新岁 javascript:window.top.space_addItem(16,23727,330,80,600,600,0); 五彩世界 javascript:window.top.space_addItem(16,23734,330,80,600,600,0); 迎新春 javascript:window.top.space_addItem(16,23736,330,80,600,600,0); 下雪FLASH挂件 javascript:window.top.space_addItem(16,23232,50,80,620,350,0); LOVE HOME javascript:window.top.space_addItem(16,23212,330,80,600,600,0); 爱的故事 javascript:window.top.space_addItem(16,23214,330,80,600,600,0); 蝶影 javascript:window.top.space_addItem(16,23216,330,80,600,600,0); love you javascript:window.top.space_addItem(16,23226,330,80,600,600,0); 纯纯爱恋 javascript:window.top.space_addItem(16,23228,330,80,600,600,0); 冬夜息乐园 javascript:window.top.space_addItem(16,23230,330,80,600,600,0); 记忆心音 javascript:window.top.space_addItem(16,23232,330,80,600,600,0); 迷离蝴蝶 javascript:window.top.space_addItem(16,23234,330,80,600,600,0); 圣殿的烛光 javascript:window.top.space_addItem(16,23236,330,80,600,600,0); 悠扬芭蕾舞 javascript:window.top.space_addItem(16,23238,330,80,600,600,0); 我是公主:javascript:window.top.space_addItem(16,22097,50,80,250,250,0); 任性的我:javascript:window.top.space_addItem(16,22098,50,80,250,250,0); 会飞的人参果:javascript:window.top.space_addItem(16,22103,50,80,250,250,0); 爱情天使 (单个) javascript:window.top.space_addItem(5,1097,0,0,1,1,0); 爱情天使( 多个) javascript:window.top.space_addItem(5,1097,0,0,4,1,0);

C# 什么是托管代码 什么是非托管代码

托管代码 (managed code) 由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

请问做论坛个性签名的代码是什么

用的是UBB代码啊,如果你要显示IP的话一般要连接一个图片,某个网站有。什么是UBB代码? UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序,国内也有不少地方使用这个程序)采用的一种特殊的TAG。你也许已经对他很熟悉了。UBB代码很简单,功能很少,但是由于其Tag语法检查实现非常容易,所以我们的社区决定引入这种代码,以方便网友使用显示图片/联接/加粗字体等常见功能。 目前可用的UBB代码:URL超级链接在你的信息里加入超级链接,只要按下列方式套入就可以了(UBB代码是红字). [url]www.iMagicPower.com[/url] 按上例套入,UBB代码会自动对URL产生链接,并保证当用户点击新的窗口时这个链接是打开着的。注意URL的“电子邮件链接 在你的信息里加入电子邮件的超级链接,只要按照下例套入就可以了(UBB代码是红字) [email]uestc95@263.net[/email] 按上例套入,UBB代码会对电子邮件自动产生链接。引用Flash文件你可以使用 [flash]粗体与斜体 你可以使用 [b] [/b] 或 [i] [/i] 这些标志以达到在贴子中使用粗体或斜体的效果. 你好, [b]管理员[/b]你好, [i]版主[/i] 加入图象 在你的信息里加入图象,只要按下例套入就可以了(UBB代码是红字). [img]在上例中,UBB代码会自动让图象在你的信息里显示。注意:URL的“横线 这个TAG是唯一不需要结束TAG的[hr]其他tag还有这些tag , u small h1 h2 h3 h4 h5 h6 strike blink sub sup del pre big center, 这些tag的功能与html的功能等同[h1]这是一个标题[/h1][/tag]是必须的让一段文字使用颜色显示 方法一:[颜色名称]文字正文[/颜色名称] [red]一段红色的字[/red]方法二:这是一个特殊的tag[#ff0000]一段红色的字[/#]#后面跟的颜色的16进制RGB代码,如红色是ff0000,绿色是00ff00,而蓝色是0000ff特别注意: UBB代码都不对大小写敏感。所以你可以用[URL] 或 [url]除了hr,email,img,url几个tag之外其他的tag都可以嵌套使用,eg. [i]我爱吃[b]冰淇淋[/b]:)~~~~//淌哈拉子[/i]但是tag之间不允许交叉使用,前面这句如果这么写就是错误的 [i]我爱吃[b]冰淇淋:)~~~~//淌哈拉子[/i][/b]不正确的UBB代码使用: [email]ted@prime-web.com[email] 在结束时,不要忘了在括号内加入斜杠[/email]

求八数码问题算法,并说明下该算法优缺点,要算法,不是源代码(可以没有)

八数码问题一.八数码问题八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。八数码问题一般使用搜索法来解。搜索法有广度优先搜索法、深度优先搜索法、A*算法等。这里通过用不同方法解八数码问题来比较一下不同搜索法的效果。二.搜索算法基类1.八数码问题的状态表示八数码问题的一个状态就是八个数字在棋盘上的一种放法。每个棋子用它上面所标的数字表示,并用0表示空格,这样就可以将棋盘上棋子的一个状态存储在一个一维数组p中,存储的顺序是从左上角开始,自左至右,从上到下。也可以用一个二维数组来存放。2.结点搜索算法中,问题的状态用结点描述。结点中除了描述状态的数组p外,还有一个父结点指针last,它记录了当前结点的父结点编号,如果一个结点v是从结点u经状态变化而产生的,则结点u就是结点v的父结点,结点v的last记录的就是结点u的编号。在到达目标结点后,通过last 可以找出搜索的路径。3.类的结构在C++中用类来表示结点,类将结点有关的数据操作封装在一起。不同的搜索算法具有一定共性,也有各自的个性,因此这里将不同搜索算法的共有的数据和功能封装在一个基类中,再通过继承方式实现不同的搜索算法。4.结点扩展规则搜索就是按照一定规则扩展已知结点,直到找到目标结点或所有结点都不能扩展为止。八数码问题的结点扩展应当遵守棋子的移动规则。按照棋子移动的规则,每一次可以将一个与空格相邻棋子移动到空格中,实际上可以看作是空格作相反移动。空格移动的方向可以是右、下、左、上,当然不能移出边界。棋子的位置,也就是保存状态的数组元素的下标。空格移动后,它的位置发生变化,在不移出界时,空格向右、下、左和上移动后,新位置是原位置分别加上1、3、-1、-3,如果将空格向右、下、左和上移动分别用0、1、2、3表示,并将-3、3、-1、1放在静态数组d中,空格位置用spac表示,那么空格向方向i移动后,它的位置变为spac+d[i]。空格移动所产生的状态变化,反映出来则是将数组p中,0的新位置处的数与0交换位置。5.八数码问题的基类八数码问题的基类及其成员函数的实现如下:#define Num 9class TEight{public:TEight(){}TEight(char *fname); //用文件数据构造节点 virtual void Search()=0; //搜索 protected:int p[Num];int last,spac;static int q[Num],d,total;void Printf();bool operator==(const TEight &T);bool Extend(int i);};int TEight::q[Num];//储存目标节点 int TEight::d={1,3,-1,-3};//方向 int TEight::total=0;//步数TEight::TEight(char *fname){ifstream fin;fin.open(fname,ios::in);if(!fin){cout《《“不能打开数据文件!“《《endl;return;}int i;for(i=0;i《Num;)//得到源节点 fin》》p[i++];fin》》spac;for(i=0;i《Num;)//得到目标节点 fin》》q[i++];fin.close();last=-1;total=0;}void TEight::Printf()//把路径打印到结果文件 {ofstream fout;fout.open(“eight_result.txt“,ios::ate|ios::app);fout《《total++《《“t“;for(int i=0;i《Num;)fout《《“ “《《p[i++];fout《《endl;fout.close();}bool TEight::operator==(const TEight &T)//判断两个状态是否相同 {for(int i=0;i《Num;)if(T.p[i]!=p[i++]) return 0;return 1;}bool TEight::Extend(int i)//扩展 {if(i==0 && spac%3==2 || i==1 && spac》5 || i==2 && spac%3==0 || i==3 && spac《3)return 0;int temp=spac;spac+=d[i];p[temp]=p[spac];p[spac]=0;return 1;}数据文件的结构:一共三行,第一行是用空格隔开的九个数字0~8,这是初始状态。第二行是一个数字,空格(数字0)的位置,第三行也是用空格隔开的九个数字0~8,这是目标状态。三.线性表搜索法在搜索过程中,需要使用一个队列存储搜索的中间结点,为了在找到目标结点后,能够找到从初始结点到目标结点的路径,需要保留所有搜索过的结点。另一方面,不同问题甚至同一问题的不同搜索方法中,需要存储的结点数量相差很大,所以这里采用链式线性表作为存储结构,同时,为适应不同问题,线性表设计成类模板形式。template《class Type》 class TList; //线性表前视定义template《class Type》 class TNode //线性表结点类模板{ friend class TList《Type》;public: TNode(){} TNode(const Type& dat);private: TNode《Type》* Next; Type Data;};template《class Type》 class TList{public: TList(){Last=First=0;Length=0;} //构造函数 int Getlen()const{return Length;} //成员函数,返回线性表长度 int Append(const Type& T); //成员函数,从表尾加入结点 int Insert(const Type& T,int k); //成员函数,插入结点 Type GetData(int i); //成员函数,返回结点数据成员 void SetData(const Type& T,int k); //成员函数,设置结点数据成员 private: TNode《Type》 *First,*Last; //数据成员,线性表首、尾指针 int Length; //数据成员,线性表长度};template《class Type》 int TList《Type》::Append(const Type& T){ Insert(T,Length); return 1;}template《class Type》 int TList《Type》::Insert(const Type& T,int k){ TNode《Type》 *p=new TNode《Type》; p-》Data=T; if(First) { if(k《=0) { p-》Next=First; First=p; } if(k》Length-1) { Last-》Next=p; Last=Last-》Next; Last-》Next=0; } if(k》0 && k《Length) { k--; TNode《Type》 *q=First; while(k--》0) q=q-》Next; p-》Next=q-》Next; q-》Next=p; } } else { First=Last=p; First-》Next=Last-》Next=0; } Length++; return 1;}template《class Type》 Type TList《Type》::GetData(int k){ TNode《Type》 *p=First; while(k--》0) p=p-》Next; return p-》Data;}template《class Type》 void TList《Type》::SetData(const Type& T,int k){ TNode《Type》 *p=First; while(k--》0) p=p-》Next; p-》Data=T;}线性表单独以头文件形式存放。四.广度优先搜索法在搜索法中,广度优先搜索法是寻找最短路经的首选。1.广度优先搜索算法的基本步骤1)建立一个队列,将初始结点入队,并设置队列头和尾指针2)取出队列头(头指针所指)的结点进行扩展,从它扩展出子结点,并将这些结点按扩展的顺序加入队列。 3)如果扩展出的新结点与队列中的结点重复,则抛弃新结点,跳至第六步。4)如果扩展出的新结点与队列中的结点不重复,则记录其父结点,并将它加入队列,更新队列尾指针。5)如果扩展出的结点是目标结点,则输出路径,程序结束。否则继续下一步。6)如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。2.搜索路径的输出搜索到目标结点后,需要输出搜索的路径。每个结点有一个数据域last,它记录了结点的父结点,因此输出搜索路径时,就是从目标结点Q出发,根据last找到它的父结点,再根据这个结点的last找到它的父结点,....,最后找到初始结点。搜索的路径就是从初始结点循相反方向到达目标结点的路径。3.广度优先搜索法TBFS类的结构广度优先搜索法TBFS类是作为TEight类的一个子类。其类的结构和成员函数的实现如下:class TBFS:public TEight{public:TBFS(){}TBFS(char *fname):TEight(fname){}virtual void Search();private:void Printl(TList《TBFS》 &L);int Repeat(TList《TBFS》 &L);int Find();};void TBFS::Printl(TList《TBFS》 &L){TBFS T=*this;if(T.last==-1)return;else{T=L.GetData(T.last);T.Printl(L);T.Printf();}}int TBFS::Repeat(TList《TBFS》 &L){int n=L.Getlen();int i;for(i=0;i《n;i++)if(L.GetData(i)==*this) break;return i;}int TBFS::Find(){for(int i=0;i《Num;)if(p[i]!=q[i++]) return 0;return 1;}void TBFS::Search(){TBFS T=*this;TList《TBFS》 L;L.Append(T);int head=0,tail=0;while(head《=tail){for(int i=0;i《4;i++){ T=L.GetData(head); if(T.Extend(i) && T.Repeat(L)》tail) { T.last=head; L.Append(T); tail++; } if(T.Find()) { T.Printl(L); T.Printf(); return; }}head++;}}4.广度优先搜索法的缺点广度优先搜索法在有解的情形总能保证搜索到最短路经,也就是移动最少步数的路径。但广度优先搜索法的最大问题在于搜索的结点数量太多,因为在广度优先搜索法中,每一个可能扩展出的结点都是搜索的对象。随着结点在搜索树上的深度增大,搜索的结点数会很快增长,并以指数形式扩张,从而所需的存储空间和搜索花费的时间也会成倍增长。五、A*算法1.启发式搜索广度优先搜索和双向广度优先搜索都属于盲目搜索,这在状态空间不大的情况下是很合适的算法,可是当状态空间十分庞大时,它们的效率实在太低,往往都是在搜索了大量无关的状态结点后才碰到解答,甚至更本不能碰到解答。搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增加试探的准确性,就要采用启发式搜索了。所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。2.A*算法A*算法是一种常用的启发式搜索算法。在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。A*算法的估价函数可表示为: f’(n) = g’(n) + h’(n) 这里,f’(n)是估价函数,g’(n)是起点到终点的最短路径值(也称为最小耗费或最小代价),h’(n)是n到目标的最短路经的启发值。由于这个f’(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:f(n) = g(n) + h(n) 其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f’(n)的近似,也就是用g(n)代替g’(n),h(n)代替h’(n)。这样必须满足两个条件:(1)g(n)》=g’(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)《=h’(n)。第二点特别的重要。可以证明应用这样的估价函数是可以找到最短路径的。3.A*算法的步骤A*算法基本上与广度优先算法相同,但是在扩展出一个结点后,要计算它的估价函数,并根据估价函数对待扩展的结点排序,从而保证每次扩展的结点都是估价函数最小的结点。A*算法的步骤如下:1)建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。2)取出队列头(队列头指针所指)的结点,如果该结点是目标结点,则输出路径,程序结束。否则对结点进行扩展。 3)检查扩展出的新结点是否与队列中的结点重复,若与不能再扩展的结点重复(位于队列头指针之前),则将它抛弃;若新结点与待扩展的结点重复(位于队列头指针之后),则比较两个结点的估价函数中g的大小,保留较小g值的结点。跳至第五步。4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。5)如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。4.八数码问题的A*算法的估价函数估价函数中,主要是计算h,对于不同的问题,h有不同的含义。那么在八数码问题中,h的含意是各什么?八数码问题的一个状态实际上是数字0~8的一个排列,用一个数组p来存储它,数组中每个元素的下标,就是该数在排列中的位置。例如,在一个状态中,p=7,则数字7的位置是3。如果目标状态数字3的位置是8,那么数字7对目标状态的偏移距离就是3,因为它要移动3步才可以回到目标状态的位置。八数码问题中,每个数字可以有9个不同的位置,因此,在任意状态中的每个数字和目标状态中同一数字的相对距离就有9*9种,可以先将这些相对距离算出来,用一个矩阵存储,这样只要知道两个状态中同一个数字的位置,就可查出它们的相对距离,也就是该数字的偏移距离: 0 1 2 3 4 5 6 7 80 0 1 2 1 2 3 2 3 41 1 0 1 2 1 2 3 2 32 2 1 0 3 2 1 4 3 23 1 2 3 0 1 2 1 2 34 2 1 2 1 0 1 2 1 25 3 2 1 2 1 0 3 2 16 2 3 4 1 2 3 0 1 27 3 2 3 2 1 2 1 0 18 4 3 2 3 2 1 2 1 0例如在一个状态中,数字8的位置是3,在另一状态中位置是7,那么从矩阵的3行7列可找到2,它就是8在两个状态中的偏移距离。估价函数中的h就是全体数字偏移距离之和。显然,要计算两个不同状态中同一数字的偏移距离,需要知道该数字在每个状态中的位置,这就要对数组p进行扫描。由于状态发生变化,个数字的位置也要变化,所以每次计算h都沿线扫描数组,以确定每个数字在数组中的位置。为了简化计算,这里用一个数组存储状态中各个数字的位置,并让它在状态改变时随着变化,这样就不必在每次计算h时,再去扫描状态数组。例如,某个状态中,数字5的位置是8,如果用数组r存储位置,那么就有r=8。现在用数组r存储当前状态的数字位置,而用s存储目标状态的数字位置,那么当前状态数字i对目标状态的偏移距离就是矩阵中r[i]行s[i]列对应的值。5.A*算法的类结构A*算法的类声明如下:class TAstar:public TEight{public:TAstar(){} //构造函数TAstar(char *fname); //带参数构造函数 virtual void Search(); //A*搜索法private:int f,g,h; //估价函数 int r[Num]; //存储状态中各个数字位置的辅助数组static int s[Num]; //存储目标状态中各个数字位置的辅助数组static int e; //存储各个数字相对距离的辅助数组 void Printl(TList《TAstar》 L); //成员函数,输出搜索路径 int Expend(int i); //成员函数,A*算法的状态扩展函数 int Calcuf(); //成员函数,计算估价函数void Sort(TList《TAstar》& L,int k); //成员函数,将新扩展结点按f从小到大顺序插入待扩展结点队列int Repeat(TList《TAstar》 &L); //成员函数,检查结点是否重复};int TAstar::s[Num],TAstar::e[Num*Num];TAstar::TAstar(char *fname):TEight(fname){ for(int i=0;i《Num;){r[p[i]]=i; //存储初始状态个个数字的位置s[q[i]]=i++; //存储目标状态个个数字的位置}ifstream fin; fin.open(“eight_dis.txt“,ios::in); //打开数据文件if(!fin){cout《《“不能打开数据文件!“《《endl;return;}for(int i=0;i《Num*Num;i++) //读入各个数字相对距离值 fin》》e[i];fin.close();f=g=h=0; //估价函数初始值 }void TAstar::Printl(TList《TAstar》 L) {TAstar T=*this;if(T.last==-1) return;else{T=L.GetData(T.last);T.Printl(L);T.Printf();}}int TAstar::Expend(int i) {if(Extend(i)) //结点可扩展{int temp=r[p[r]]; //改变状态后数字位置变化,存储改变后的位置 r[p[r]]=r;r=temp;return 1;}return 0;}int TAstar::Calcuf(){h=0;for(int i=0;i《Num;i++) //计算估价函数的 hh+=e[Num*r[i]+s[i]];return ++g+h; }void TAstar::Sort(TList《TAstar》& L,int k){int n=L.Getlen();int i;for(i=k+1;i《n;i++){TAstar T=L.GetData(i);if(this-》f《=T.f) break;}L.Insert(*this,i);}int TAstar::Repeat(TList《TAstar》 &L){int n=L.Getlen();int i;for(i=0;i《n;i++)if(L.GetData(i)==*this) break;return i;}void TAstar::Search(){TAstar T=*this; //初始结点T.f=T.Calcuf(); //初始结点的估价函数TList《TAstar》 L; //建立队列L.Append(T); //初始结点入队int head=0,tail=0; //队列头和尾指针while(head《=tail) //队列不空则循环{for(int i=0;i《4;i++) //空格可能移动方向{ T=L.GetData(head); //去队列头结点 if(T.h==0) //是目标结点 { T.Printl(L);//输出搜索路径 T.Printf(); //输出目标状态 return; //结束 } if(T.Expend(i)) //若结点可扩展 { int k=T.Repeat(L); //返回与已扩展结点重复的序号 if(k《head) //如果是不能扩展的结点 continue; //丢弃 T.last=head; //不是不能扩展的结点,记录父结点 T.f=T.Calcuf(); //计算f if(k《=tail) //新结点与可扩展结点重复 { TAstar Temp=L.GetData(k); if(Temp.g》T.g) //比较两结点g值 L.SetData(T,k); //保留g值小的 continue; } T.Sort(L,head) ; //新结点插入可扩展结点队列 tail++; //队列尾指针后移 }}head++; //一个结点不能再扩展,队列头指针指向下一结点}}六、测试程序A*算法的测试:int main(){ TAstar aStar(“eight.txt“); aStar.Search(); system(“pauze“); return 0;}eight.txt文件中的数据(初始态和目标态):一共三行,第一行是用空格隔开的九个数字0~8,这是初始状态。第二行是一个数字,空格(数字0)的位置,第三行也是用空格隔开的九个数字0~8,这是目标状态。8 3 5 1 2 7 4 6 081 2 3 4 5 6 7 8 0eight_dis.txt中的数据(估计函数使用)0 1 2 1 2 3 2 3 41 0 1 2 1 2 3 2 32 1 0 3 2 1 4 3 21 2 3 0 1 2 1 2 32 1 2 1 0 1 2 1 23 2 1 2 1 0 3 2 12 3 4 1 2 3 0 1 23 2 3 2 1 2 1 0 14 3 2 3 2 1 2 1 0eight_Result.txt中的结果(运行后得到的结果)七、算法运行结果1.BFS算法只能适用于到达目标结点步数较少的情况,如果步数超过15步,运行时间太长,实际上不再起作用。2.对于随机生成的同一个可解状态,BFS算法最慢,DBFS算法较慢,A*算法较快。但在15步以内,DBFS算法与A*算法相差时间不大,超过15步后,随步数增加,A*算法的优势就逐渐明显,A*算法要比DBFS算法快5倍以上,并随步数增大而增大。到25步以上,DBFS同样因运行时间过长而失去价值。3.一般来说,解答的移动步数每增加1,程序运行时间就要增加5倍以上。由于八数码问题本身的特点,需要检查的节点随步数增大呈指数形式增加,即使用A*算法,也难解决移动步数更多的问题。八、问题可解性八数码问题的一个状态实际上是0~9的一个排列,对于任意给定的初始状态和目标,不一定有解,也就是说从初始状态不一定能到达目标状态。因为排列有奇排列和偶排列两类,从奇排列不能转化成偶排列或相反。如果一个数字0~8的随机排列871526340,用F(X)表示数字X前面比它小的数的个数,全部数字的F(X)之和为Y=∑(F(X)),如果Y为奇数则称原数字的排列是奇排列,如果Y为偶数则称原数字的排列是偶排列。例如871526340这个排列的Y=0+0+0+1+1+3+2+3+0=1010是偶数,所以他偶排列。871625340Y=0+0+0+1+1+2+2+3+0=99是奇数,所以他奇排列。因此,可以在运行程序前检查初始状态和目标状态的窘是否相同,相同则问题可解,应当能搜索到路径。否则无解。PS:整理自网络


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 燃气轮机是内燃机还是外燃机(外燃机)

下一篇: 小米11配置参数表(华为p40和小米11参数对比)



推荐阅读