仙岛求药(BFS)

原问题:计蒜客T1212

问题描述:

 

输入样例1:

8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###

输出样例1:

10

输入样例2:

6 5
.*.#.
.#...
..##.
.....
.#...
....@

输出样例2:

8

输入样例3:

9 6
.#..#. 
.#.*.# 
.####. 
..#... 
..#... 
..#... 
..#... 
#.@.## 
.#..#.

输出样例3:

-1

题意:

在迷宫中,从一个点走到另一个点,寻找两点间的最短路径。

思路:

这题一个搜索应该就可以直接解决(数据不大),最优解/最短路径这种问题一般就直接想BFS了...(想了想用DFS来遍历好像也不是不行,结果就是TLE了...

BFS:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char mapp[30][30];
 4 int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
 5 int vis[30][30];
 6 int m, n, x, y, d;
 7 struct node
 8 {
 9     int x, y, d;
10     node(int xx, int yy, int dd)
11     {
12         x=xx;
13         y=yy;
14         d=dd;
15     }
16 };
17 bool in(int x, int y)
18 {
19     return x<m&&x>=0&&y<n&&y>=0;
20 }
21 int bfs(int sx, int sy)
22 {
23     queue<node> q;
24     q.push(node(sx,sy,0));
25     vis[sx][sy]=1;
26     while(!q.empty())
27     {
28         node now=q.front();
29         q.pop();
30         for(int i=0; i<4; i++)
31         {
32             int tx=now.x+dir[i][0];
33             int ty=now.y+dir[i][1];
34             if(in(tx,ty)&&mapp[tx][ty]!='#'&&vis[tx][ty]==0)
35             {
36                 if(mapp[tx][ty]=='*')
37                     return now.d+1;
38                 else
39                 {
40                     vis[tx][ty]=1;
41                     q.push(node(tx,ty,now.d+1));
42                 }
43             }
44         }
45     }
46     return -1;
47 }
48 int main()
49 {
50     cin>>m>>n;
51     for(int i=0; i<m; i++)
52     {
53         cin>>mapp[i];
54         for(int j=0; j<n; j++)
55         {
56             if(mapp[i][j]=='@')
57             {
58                 x=i;
59                 y=j;
60             }
61         }
62     }
63     cout<<bfs(x,y)<<endl;
64     return 0;
65 }

 

DFS:

(贴一下TLE的代码)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char mapp[30][30];
 4 int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
 5 int ans=1000000;
 6 int flag=0;
 7 int m, n, x, y;
 8 int vis[30][30];
 9 bool in(int x,int y)
10 {
11     return x>=0&&x<m&&y>=0&&y<n;
12 }
13 void dfs(int x, int y, int depth)
14 {
15     if(mapp[x][y]=='*')
16     {
17         flag=1;
18         if(depth<ans)
19         {
20         ans=depth;
21         }
22         return ;
23     }
24     vis[x][y]=1;
25     for(int i=0; i<4; i++)
26     {
27         int tx=x+dir[i][0];
28         int ty=y+dir[i][1];
29         if(!vis[tx][ty]&&in(tx,ty)&&mapp[tx][ty]!='#')
30         {
31             dfs(tx,ty,depth+1);
32         }
33     }
34     vis[x][y]=0;
35 }
36 int main()
37 {
38     cin>>m>>n;
39     for(int i=0; i<m; i++)
40     {
41         cin>>mapp[i];
42     }
43     for(int i=0; i<m; i++)
44         for(int j=0; j<n; j++)
45             if(mapp[i][j]=='@')
46             {
47                 x=i;
48                 y=j;
49             }
50     dfs(x,y,0);
51     if(flag==1)
52         cout<<ans<<endl;
53     else
54         cout<<-1<<endl;
55     return 0;
56 }
posted @ 2021-05-13 16:43  MarmotY  阅读(620)  评论(0)    收藏  举报