bfs的练习

bfs搜索算法即广度搜索

思路:遍历的过程利用队列存放每一层的元素信息,依次遍历每个元素,返回最短的路径

 

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 
 8 //数据结构
 9 //存放二维数组的x,y,step步长
10 struct node{
11   int x, y, step;
12 };
13 
14 //sx,sy起始地址
15 //ex,ey终止地址
16 int x, y, sx, sy, ex, ey, mark[105][105][2], cnt = 0;
17 int dir[8][2] = {0,1,1,0,0,-1,-1,0,1,1,1,1,-1,-1,1,-1,-1};
18 char mmap[105][105];
19 
20 void func(int x, int y){
21   if(mmap[x][y] == 'S') return ;
22   mmap[x][y] = '0';
23   func(mark[x][y][0], mark[x][y][1]);
24 
25 }
26 
27 void p(){
28   cout << "--------- cnt = " << cnt << "-------------" << endl;
29   for(int i = 1; i <= n; i++){
30     for(int j = 1; j<= m; j++){
31       if(mmap[i][j] == 'x')
32         mmap[i][j] = 'Z';
33     }
34     cout << endl;
35   }
36 
37   cout << "--------------------------------------" << endl;
38 
39 }
40 
41 int main(){
42   cin >> n >> m;
43   for(int i = 1; i <= n; i++){
44     for(int j = 1; j<=m; j++){
45       cin >> mmap[i][j];
46       if(mmap[i][j] == 'S'){
47         sx = i, sy = j;
48       }
49       if(mmap[i][j] == 'T')
50         ex = i, ey = j;
51     }
52   }
53   //创建队列存放每一层的数值
54   queue<node> que;
55   que.push((node){sx, sy, 0});
56   while(!que.empty()){
57     node temp = que.front();
58     que.pop();
59     //方向数组的遍历
60     for(int i = 0; i < 8; i++){
61       int x = temp.x + dir[i][0];
62       int y = temp.y + dir[i][1];
63       //走到终点
64       if(mmap[x][y] == 'T'){
65         func(temp.x, temp.y);
66         p();
67         cout << temp.step + 1 << endl;
68         return 0;
69       }
70       //经过的路径
71       if(mmap[x][y] == '.'){
72         que.push((node){x, y, step.step + 1});
73         mmap[x][y] = 'x';
74         mark[x][y][0] = temp.x, mark[x][y][1] = temp.y;
75         cnt++:
76         if(cnt % 10 == 0)
77           p();
78       }
79     }
80   }
81   
82 
83     return 0;
84 }

 

 启发式搜索: 利用启发函数缩短搜索的范围,利用优先队列实现最短的搜索路径

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <time.h>
 6 #include <vector>
 7 #include <queue>
 8 
 9 using namespace std;
10 
11 struct node{
12     int x,y, step;
13     double dis; //预估距离
14     bool operator<(const  node &b) const{
15         return this->step + this->dis > b.step + b.dis;
16     }
17 };
18 
19 int n , m, sx, sy, ex, ey, mark[105][105][2], cnt;
20 int dir[8][2] = {0,1,1,0, 0, -1, -1,0, 1,1,1,-1, -1,1,-1,-1};
21 char mmap[105][105];
22 
23 double cal(int x, int y){
24     int t1 = ex - x, t2 = ey-y;
25     return sqrt(t1 * t1 + t2 *t2);
26 }
27 
28 void func(int  x, int y){
29     if(mmap[x][y] == 'S') return ;
30     mmap[x][y] = 'o';
31     func(mark[x][y][0], mark[x][y][1]);
32 }
33 
34 void p(){
35     cout << "--------cnt = "<< cnt << "--------" << endl;
36     for(int i = 1; i<=n; i++){
37         for(int j = 1; j<=m; j++){
38             cout << mmap[i][j];
39             if(mmap[i][j] == 'x'){
40                 mmap[i][j] = 'Z';
41             }
42         }
43         cout << endl;
44     }
45     cout << "----------------------------------------------"<<endl;
46 }
47 
48 
49 int main(int argc, char *argv[]){
50     cin >> n >> m;
51     for(int i = 1; i <= n; i++){
52         for(int j = 1; j <= m; j++){
53             cin >> mmap[i][j];
54             if(mmap[i][j] == 'S'){
55                 sx = i, sy = j;
56             }
57             if(mmap[i][j] == 'T'){
58                 ex = i, ey = j;
59             }
60         }
61     }
62 
63     priority_queue<node> que;
64     que.push((node){sx, sy, 0, cal(sx, sy)});
65     while(!que.empty()){
66         node temp = que.top();
67         que.pop();
68         for(int i = 0; i< 8; i++){
69             int x = temp.x + dir[i][0];
70             int y = temp.y + dir[i][1];
71             if(mmap[x][y] == 'T'){
72                 func(temp.x, temp.y);
73                 p();
74                 cout << temp.step + 1 << endl;
75                 return 0;
76             }
77 
78             if(mmap[x][y] == '.'){
79                 mark[x][y][0] = temp.x, mark[x][y][1] = temp.y;
80                 que.push((node){x, y, temp.step + 1, cal(x, y)});
81                 mmap[x][y] = 'x';
82                 cnt++;
83                 if(cnt % 10 == 0)
84                     p();
85             }
86         }
87     }
88 
89     cout << "no"<<endl;
90     return 0;
91 }

 

上一篇:[Linux 高并发服务器] 内存映射


下一篇:IO优化:使用mmap使读取文件的效率提升