广搜练习

 题目描述:
图表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。

 

【思路】:经过的城市最少然后。。广搜。。因为一层一层的找嘛,先找到的一定是经过城市最少的

【代码】

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 bool ccan[9][9]={{0,0,0,0,0,0,0,0,0},
 6                  {0,1,0,0,0,1,0,1,1},
 7                  {0,0,1,1,1,1,0,1,1},
 8                  {0,0,1,1,0,0,1,1,1},
 9                  {0,0,1,0,1,1,1,0,1},
10                  {0,1,1,0,1,1,1,0,0},
11                  {0,0,0,1,1,1,1,1,0},
12                  {0,1,1,1,0,0,1,1,0},
13                  {0,1,1,1,1,0,0,0,1}};//邻接矩阵 ,0表示可以走,1表示不可以走 
14 int qque[100],pre[100];//队列和前驱结点,用来输出路径 
15 bool visited[10];//是否入队列 
16 int oout(int);//输出路径 
17 void bfs();//广搜 
18 int main()
19 {
20     dfs();
21     return 0;
22 }
23 void bfs()
24 {
25     int head=0,tail=1;//队列的指针 
26     qque[1]=1;pre[1]=0;visited[1]=1;//记录队列的 第一个元素是1(A),它的前驱是0,它已经访问了 
27     do
28     {
29         head++;
30         for(int i=1;i<=8;i++)//寻找A,B,C,D,E,F,G,H中能够走的 
31         {
32             if(!ccan[qque[head]][i]&&!visited[i])//能都走并且没有访问 
33             {
34                 tail++;
35                 qque[tail]=i;//入队 
36                 visited[i]=1;//打标记 
37                 pre[i]=qque[head];//记录前驱 
38                 if(i==8)//当搜到H,输出 
39                 {
40                     oout(tail);
41                     head=tail;
42                     break;
43                 }
44             }
45         }
46     }while(head<tail);
47 }
48 int oout(int x)
49 {
50     cout<<char(qque[x]+64);//首先输出H 
51     while(pre[x]!=0)
52     {
53          x=pre[x];//不要 int x=pre[x]再重新定义是不可以的,那样形参x就不变了orz 
54         cout<<"---"<<char(x+64);
55     }
56     cout<<endl;
57 }

 

 
posted @ 2017-03-31 10:43  ANhour  阅读(342)  评论(0编辑  收藏  举报