仙岛求药(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 }

浙公网安备 33010602011771号