hdu Find a way

来源:互联网 发布:python 频域分析 编辑:程序博客网 时间:2024/05/21 13:56

这题很简单啊~ 

思路:
碰到M和Y都进行一遍广搜,然后碰到@时就把位移路径放入ans[i][j] 然后在搜索结束后遍历一遍ans,找出来最小值就行

注意:

1 如果ans用数组存又初始化的话,没有被赋值的都是0,在用min寻找最小距离时时注意跳过这些

2 因为你会搜索两次地图(一次M,一次Y)所以记得每搜索一次之前都要清空visit;

代码如下:

#include<iostream>#include<queue>#include<cstring>using namespace std;int m,n,visit[205][205],ans[205][205];char map[205][205];struct node{int x;int y;};node d,D;void bfs(int x,int y){queue<node>q;while(!q.empty())q.pop();d.x=x;d.y=y;q.push(d);int move[4][2]={0,1,1,0,0,-1,-1,0};while(!q.empty()){d=q.front();q.pop();for(int i=0;i<4;i++){D.x=d.x+move[i][0];D.y=d.y+move[i][1];if(D.x>=1 && D.x<=m && D.y>=1 && D.y<=n && !visit[D.x][D.y] && map[D.x][D.y]!='#'){visit[D.x][D.y]=visit[d.x][d.y]+1;if(map[D.x][D.y]=='@'){ans[D.x][D.y]+=visit[D.x][D.y];}q.push(D);}}}}int main(){while(cin>>m>>n){memset(map,0,sizeof(map));memset(ans,0,sizeof(ans));for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cin>>map[i][j];}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(map[i][j]=='Y' || map[i][j]=='M'){memset(visit,0,sizeof(visit));bfs(i,j); }}}int Min=99999;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(ans[i][j] && Min>ans[i][j]){Min=ans[i][j];}}}cout<<Min*11<<endl;}}


0 0