bfs求最短路的几道例题

题目来自于记蒜客数据结构课,类型差不多,都是用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();
 51             for(int adj=0;adj<n;adj++){
 52                 if(!visited[adj] && mat[cur_ver][adj]==1){
 53                     distance[adj]=distance[cur_ver]+1;
 54                     temp.push(adj);
 55                     visited[adj]=true;
 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 }

 

posted @ 2017-07-04 17:07  NoviScl  阅读(651)  评论(0编辑  收藏