bfs-迷宫

给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要走几个空地才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进。,还可以自行打印路径

在这里插入图片描述
Input
第1行:n m
第2至n+1行:整个地图地形描述(0:空地;1:高山),
如(图)第2行地形描述为:1 0 0 0 0 1 0
第3行地形描述为:0 0 1 0 1 0 0
……
第n+2行:x1 y1 x2 y2 (分别为起点、终点坐标)
Output
s (即最少的行走次数)
Sample Input
5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7
Sample Output

10
————————————————
版权声明:本文为CSDN博主「_Alexander」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44091178/article/details/88767367

 

 1  1 #include<iostream>
 2  2 #include<queue> 
 3  3 using namespace std;
 4  4 struct node
 5  5 {//状态 
 6  6     int x,y;
 7  7     int step;//当前状态的步数 
 8  8 };
 9  9 int dir[]={0,1,0,-1,0};//方向 
10 10 //int par[1001]={0};//加入路径搜索,适用于带有状态迭代的路径搜索中,因为父亲只有一个,,,bfs形成的是一颗搜索树
11 11 void print(int index)
12 12 {
13 13     if(par[index]==0)
14 14     {
15 15         cout<<index<<" "; return ;
16 16     }
17 17     else
18 18     {
19 19         int parent_index=par[index];
20 20         print(parent_index);
21 21         cout<<index<<" ";
22 22     }
23 23 }
24 24 int main()
25 25 {
26 26     int n,m,x1,x2,y1,y2;
27 27     int map[100][100];
28 28     cin>>n>>m;
29 29     int *visit=new int[n*m+3];//判重 
30 30     for(int i=0;i<n*m+3;i++) visit[i]=0;
31 31     for(int i=1;i<=n;i++)
32 32     {//初始化 
33 33         for(int j=1;j<=m;j++)
34 34         {
35 35             cin>>map[i][j];
36 36         }
37 37     }
38 38     cin>>x1>>y1>>x2>>y2;
39 39     node start;//初始状态 
40 40     start.x=x1; start.y=y1; start.step=0;
41 41     queue<node> q;
42 42     visit[(x1-1)*m+y1]=true;
43 43     q.push(start);
44 44     if(start.x==x2&&start.y==y2)
45 45     {//防止刁钻数据 
46 46         cout<<"step"<<":"<<0<<endl;
47 47         return 0;
48 48     }
49 49     while(!q.empty())
50 50     {//bfs 
51 51         node local=q.front();
52 52         q.pop();
53 53         for(int i=0;i<4;i++)
54 54         {//注意,这里指的x,y是指结点的行,列,而非坐标,,,,不要混淆 
55 55             int x=local.x+dir[i],y=local.y+dir[i+1];
56 56             if(x<1||x>n||y<1||y>m||visit[(x-1)*m+y]||map[x][y]) continue;
57 57             node temp=local;
58 58             temp.x=x; temp.y=y; temp.step++;
59 59             
60 60             visit[(x-1)*m+y]=1;
61 61             //par[(x-1)*m+y]=m*(local.x-1)+local.y;
62 62             q.push(temp);
63 63             if(temp.x==x2&&temp.y==y2)
64 64             {
65 65                 cout<<"step"<<":"<<temp.step<<endl;
66 66                 //cout<<"打印路径:"<<endl;
67 67                 //int end=(x2-1)*m+y2;
68 68                 //print(end);
69 69                 
70 70                 delete visit;
71 71                 return 0;
72 72             }
73 73         }
74 74     }    
75 75     delete visit;
76 76     cout<<"no"<<endl;
77 77     return 0;
78 78  } 

//以上也实现了路径打印操作,详情可见注释掉的部分代码!

posted @ 2020-01-27 22:49  SSXFC  阅读(282)  评论(2编辑  收藏  举报