《信息学奥赛一本通》 广度优先搜索算法 【例8.1】图8-2表示的是从城市A到城市H的交通图。 书本代码详解

【例8.1】图8-2表示的是从城市A到城市H的交通图。
从图中可以看出,从城市A到城市H要经过若干个城市。
现要找出一条经过城市最少的一条路线。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int ju[9][9]={{0,0,0,0,0,0,0,0,0},
        	{0,1,0,0,0,1,0,1,1},
            {0,0,1,1,1,1,0,1,1},
            {0,0,1,1,0,0,1,1,1},
            {0,0,1,0,1,1,1,0,1},
            {0,1,1,0,1,1,1,0,0},
            {0,0,0,1,1,1,1,1,0},
        	{0,1,1,1,0,0,1,1,0},
            {0,1,1,1,1,0,0,0,1}};
int a[101],b[101];
bool s[9];                              //初始化
int out(int d)                          //输出过程
{
	cout<<char(a[d]+64);			//由城市编号转为字母 
	while (b[d])                    //==while(b[d]==0)
	{
    	d=b[d];                      //得到上个城市 
    	cout<<"--"<<char(a[d]+64);
	}
    cout<<endl;
}

void doit()
{
   int head,tail,i; 
   head=0;                                     //第0组探寻 
   tail=1;                             		//第一次探寻 
   a[1]=1;                                   //城市A为第一次探索城市 
   b[1]=0;                                   //记录从哪个城市到达该市可在A前放个城市0 
   s[1]=1;                                   //表示该城市已经到过
   do                                 
   {
    	head++;                               //若一组探寻无法到达H市,则开始下一组探寻 
   	 	for (i=1;i<=8;i++)                 //搜索可直通的城市
    	if ((ju[a[head]][i]==0)&&(s[i]==0))  //判断城市是否走过,若有其他城市也可到该市,
	                                             //经过城市次数一定大于等于当前情况,无需考虑 
        {
        	tail++;                              //若能找到则探索次数+1 
        	a[tail]=i;						//a[]数值即为第几次探索城市编号 
        	b[tail]=head;						//从哪个城市来,如现在b[tail]来自城市编号为a[head] 
        	s[i]=1;								//禁用该城 
        	if (i==8)                         //若i==8则已到H城 
          	{
          	    out(tail);
				head=tail;                  //break只退出了do循环,head=tail退出while循环,可减少运行次数 
				break; 						//第一次搜到H城市时路线最短	                           
            }
        }
    }
	while (head<tail);
}
int main()                                   //主程序
{
    memset(s,false,sizeof(s));
    doit();                                       //进行Bfs操作
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值