# bfs求最短路的几道例题

```  1 //记蒜客习题
2 //bfs求某点到其他各点的最短距离
3 #include <iostream>
4 #include <cstring>
5 #include <queue>
6 using namespace std;
7
8 class Graph{
9 private:
10     int n;
11     bool *visited;
12     int **mat;
13     int *distance;
14 public:
15     Graph(int input_n){
16         n=input_n;
17         visited=new bool[n];
18         memset(visited,0,n);
19         mat=new int*[n];
20         for(int i=0;i<n;i++){
21             mat[i]=new int[n];
22             memset(mat[i],0,sizeof(int)*n);
23         }
24         distance=new int[n];
25         memset(distance,0,sizeof(int)*n);
26     }
27
28     ~Graph(){
29         delete[] visited;
30         for(int i=0;i<n;i++){
31             delete[] mat[i];
32         }
33         delete[] mat;
34         delete[] distance;
35     }
36
37     void insert(int x, int y){
38         mat[x-1][y-1]=1;
39         mat[y-1][x-1]=1;
40     }
41
42     void calculate(int start_ver){
43         int cur_ver;
44         int start=start_ver-1;
45         queue<int> temp;
46         temp.push(start);
47         visited[start]=true;
48         while(!temp.empty()){
49             cur_ver=temp.front();
50             temp.pop();
56                 }
57             }
58         }
59     }
60
61     void print_dis(){
62         for(int i=0;i<n;i++){
63             cout<<distance[i]<<endl;
64         }
65     }
66
67 };
68
69 int main(){
70     int n,m,a,b,start;
71     cin>>n>>m>>start;
72     Graph g(n);
73     for(int i=0;i<m;i++){
74         cin>>a>>b;
75         g.insert(a,b);
76     }
77     g.calculate(start);
78     g.print_dis();
79 }
80
81
82
83
84
85
86
87 //迷宫中的英雄
88 #include <iostream>
89 #include <queue>
90 #include <cstring>
91 using namespace std;
92
93 int n,m,t,sx,sy,px,py;
94
95 struct step{
96     int x, y, dis=0;
97 };
98
99 char map[100][100];
100 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
101 int visited[100][100];
102
103 void bfs(){
104     queue<step> Q;
105     step cur,temp;
106     cur.x=sx;
107     cur.y=sy;
108     cur.dis=0;
109     Q.push(cur);
110     visited[sx][sy]=1;
111     while(!Q.empty()){
112         cur=Q.front();
113         Q.pop();
114
115         if(cur.dis>t){
116             break;
117         }
118
119         if(cur.x==px&&cur.y==py){
120             cout<<"YES"<<endl;
121             return;
122         }
123
124         for(int i=0;i<4;i++){
125             temp.x=cur.x+dir[i][0];
126             temp.y=cur.y+dir[i][1];
127             if(temp.x>=0 && temp.x<m && temp.y>=0 && temp.y<n && map[temp.x][temp.y]!='*' && visited[temp.x][temp.y]==0){
128                 temp.dis=cur.dis+1;
129                 Q.push(temp);
130                 visited[temp.x][temp.y]=1;
131             }
132         }
133     }
134     cout<<"NO"<<endl;
135 }
136
137
138 int main(){
139     while(cin>>n>>m>>t){
140         if(n==0&&m==0&&t==0){
141             break;
142         }
143         memset(map,0,sizeof(map));
144         memset(visited,0,sizeof(visited));
145         for(int i=0;i<m;i++){
146             for(int j=0;j<n;j++){
147                 cin>>map[i][j];
148                 if(map[i][j]=='S'){
149                     sx=i;
150                     sy=j;
151                 }
152                 if(map[i][j]=='P'){
153                     px=i;
154                     py=j;
155                 }
156             }
157         }
158         bfs();
159     }
160     return 0;
161 }
162
163
164
165
166
167
168
169 //bfs 解骑马走江湖
170 #include <iostream>
171 #include <queue>
172 #include <cstring>
173 using namespace std;
174
175 struct point{
176     int x,y,step;
177 };
178
179 char map[105][105];
180 bool visited[105][105];
181 int height,width,Xstart,Ystart,Xend,Yend;
182 int dir[8][2]={{-2,1},{-2,-1},{2,1},{2,-1},{-1,-2},{1,-2},{-1,2},{1,2}};
183 int horse_leg[8][2]={{-1,0},{-1,0},{1,0},{1,0},{0,-1},{0,-1},{0,1},{0,1}};
184
185
186 int bfs(queue<point> Q){
187     int Xblcok,Yblock;
188     int x=Xstart;
189     int y=Ystart;
190     Q.push(point{x,y,0});
191     visited[x][y]=1;
192     while(!Q.empty()){
193         point cur=Q.front();
194         if(cur.x==Xend&&cur.y==Yend){
195             return cur.step;
196         }
197         for(int i=0;i<8;i++){
198             x=cur.x+dir[i][0];
199             y=cur.y+dir[i][1];
200             Xblcok=cur.x+horse_leg[i][0];
201             Yblock=cur.y+horse_leg[i][1];
202             if(x>=0&&x<height&&y>=0&&y<width&&map[x][y]!='#'&&map[Xblcok][Yblock]!='#'&&!visited[x][y]){
203                 Q.push({x,y,cur.step+1});
204                 visited[x][y]=1;
205             }
206         }
207         Q.pop();
208     }
209     return -1;
210 }
211
212
213 int main(){
214     while(cin>>height>>width){
215         queue<point> Q;
216         memset(visited,0,sizeof(visited));
217         for(int i=0;i<height;i++){
218             for(int j=0;j<width;j++){
219                 cin>>map[i][j];
220                 if(map[i][j]=='s'){
221                     Xstart=i;
222                     Ystart=j;
223                 }
224                 if(map[i][j]=='e'){
225                     Xend=i;
226                     Yend=j;
227                 }
228             }
229         }
230         cout<<bfs(Q)<<endl;
231     }
232     return 0;
233 }```

原文作者：NoviScl
原文地址: https://www.cnblogs.com/NoviScl/p/7117528.html
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。