首页 > 编程知识 正文

广度优先搜索算法实现,有界深度优先搜索方法

时间:2023-05-05 17:28:53 阅读:50816 作者:4808

练习1。

这里有代码片# include bits/stdc.husingnamespacestd; 结构点/*是队列中的三个元素*/{int x; int y; 输入步骤; (; /*规定地图以外的区域用0表示,可步行区域用1表示2表示障碍物(不可步行)区域) */int n,a(110 )、a(110 )、110 ); /*保存地图的大小、地图,记录通过哪个位置、未通过哪个位置。 */queuepointq; 定义//队列/* 51121121122121221221111121218 */int main ({ cinn; for(intI=1; i=n; 构建I//地图{for(intj=1; j=n; j({Cina[I][j]; }/* bfs */pointstart={ 1,1,0 },temp; //第一行的第一列为0步,因此,如果while(q.empty )==0)/*队列为空则退出,如果队列为空则进行搜索(如果队列为空则返回true ) //位于团队开头元素中的行下标int y=q.front ().y; //第一个元素列的下标int step=q.front ().step; /*从团队领导要素中取出到此为止所需的步骤数*/if(x==ny==n )//到达目标地点后输出到大目标点所需的步骤并结束。 {coutstep; 布雷克; (/(上)/if ) a[x-1][y]==1b[x-1][y]==0) ) /上位置为1表示是可以行走的区域,同时该位置的标记为0表示还没有行走//新行的下标temp.y=y; //新列的下标temp.step=step 1; //每走一步,步数为1q.push(temp ); //入队b[x-1][y]=1; 进入队伍后表示通过,通过后将其代入1表示通过。 (/(下)/if ) a[x1][y]==1b[x1][y]==0) ) /上面的位置必须是1,但这个位置还没有走就可以排队了) { temp.x temp.y=y; temp.step=step 1; q .推送(temp ); 表示进入队伍后步行,通过后将其代入1表示步行。 b[x 1][y]=1; } /*左*/if(a[x][y-1]==1b[x][y-1]==0) {temp.x=x; temp.y=y-1; temp.step=step 1; q .推送(temp ); b[x][y-1]=1; (/)右)/if ) a[x][y1]==1b[x][y1]==0) {temp.x=x; temp.y=y 1; temp.step=step 1; q .推送(temp ); b[x][y 1]=1; (}q.pop ); 不能上下左右行走时,必须删除团队领导的要素。 }返回0; )练习2。

/*最短路径问题:求解从a城市到大目标城市的最短路径:解题思路:首先用序列a记录路径城市,再用序列b记录通过的城市。 数组c记录哪个城市在每次a记录时未通过的城市,数组b记录该城市的前驱城市……当找到目标城市时,最短路径已经存储在b数组中。 b按相反的顺序输出数组是我们想要的答案。 //# include bits/stdc.husingnamespacestd; //使用邻接矩阵表示城市,因为只有8个城市,所以需要开出8*8的二维数组,这里不使用第0行和第0列,所以9*9的int city [9] [9]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //记录途径城市int b[101] //记录途径城市的前驱城市int c[9]; //标记哪个城市通过了重复避免//输出函数out,用于反向输出传递给存储在b城市的前驱城市voidout(intd )//前驱城市的b数组的下标。 这个下标与前驱城市的下标相对应,将其输出到a数组即可) coutchar ) a[d]64 ); //a [8]=8,864==72-' h '; while(b[d]!=0)/b数组中记录了各前驱城市,最初为a的前驱城市0,因此如果b数组中的元素为0,则b数组按相反顺序输出({d=b[d]; //请注意,此语句是该循环的循环变量的自减法。 cout'--'char(a[d]64 ); (//宽搜索函数void bfs ) )//初始化int head=0,tail=1; //定义主题,主题a[1]=1; //在起点城市入伍b[1]=0; //A城没有前驱城市,所以0c[1]=1; //A城为do{head; //团队领导搜索新城for (inti=1; i=8; I ) ) /能够根据遍历规则遍历的方法的数量: A-A、A-B、A-c、A-d、A-E、A-F、A-H; 加入if(city[head][I]==0c[I]==0) (搜索每一层,搜索每个城市) /如果该城市能走)直走但没有走。 {tail; //在团队末尾添加1,使新城市成为团队a[tail]=i; //入队b[tail]=head; //记录每个城市的前驱城市(b、c、d、f的前驱城市在a邻接矩阵中用1表示a,所以将1入队) c[i]=1; //为每个步行的城市标记IF (I==8) ) ) )如果入伍的是第八个城市h,则表示我们找到的目标城市。 此时,只要将保存在b城市中的城市按相反顺序输出就可以得到最短路线。 h--f--a{out ) ) ) tail ); //B将保存在城市中的前驱城市break按相反顺序输出; }}}while(headtail ); //遍历完整节点时停止搜索(} int main ) ) BFS ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。