标签:har tar ret 输出 mtime eof oid lsh tps
直接上Chinese
Descriptions:
Input
输入存在多组(需使用!=EOF)
每组的第一行有两个整数n,m(2<=n,m<=200)
接下来n行,每行包括m个字符
‘Y’表示hsj所在的位置
‘M’表示lsh所在的位置
‘.’表示可以通过的地方
‘#’表示教学楼即不能走的地方
‘@’表示稀有土拨鼠刷新的地方(地图中存在多只稀有土拨鼠)
Output
对于每组样例输出他们到达土拨鼠刷新点的最小时间总和。
保证每组样例都存在一个土拨鼠刷新点,他们两都能到达
Sample Input
4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
Sample Output
66 88 66
题目链接:
https://vjudge.net/problem/HDU-2612
这可以说是一题两个bfs
分别求出Y、M在这张地图所有地方的所用时间,再求出在"@"地方的时间的最小值即可
具体操作看代码
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) using namespace std; int T,n,m; char mp[1005][1005];//原始地图 int vis[1005][1005];//记录人是否走过 int ytime[1005][1005];//Y 经过这个地方的时间 int mtime[1005][1005];//M 经过这个地方的时间 int dt[][2]= {{1,0},{-1,0},{0,1},{0,-1}};//四个方向 struct node { int x,y;//坐标 }; node now,net; node Y,M; void bfs(int f)//人 { queue<node>q; MEM(vis,0);//都要初始化,都没走过,设为0 if(f==0)// Y的情况 { MEM(ytime,INF); q.push(Y); vis[Y.x][Y.y]=1; ytime[Y.x][Y.y]=0; } if(f==1)// M的情况 { MEM(mtime,INF); q.push(M); vis[M.x][M.y]=1; mtime[M.x][M.y]=0; } while(!q.empty())// bfs 一样的套路 { now=q.front(); q.pop(); for(int i=0; i<4; i++)//四个方向 { net.x=now.x+dt[i][0]; net.y=now.y+dt[i][1]; if(net.x>=0&&net.x<n&&net.y>=0&&net.y<m&&!vis[net.x][net.y]&&mp[net.x][net.y]!=‘#‘)//满足条件 { q.push(net);//入队 vis[net.x][net.y]=1;//走过了 if(f==0)//Y 的路线时间 ytime[net.x][net.y]=ytime[now.x][now.y]+1; if(f==1)//M 的路线时间 mtime[net.x][net.y]=mtime[now.x][now.y]+1; } } } } int main() { while(cin>>n>>m) { for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cin>>mp[i][j]; if(mp[i][j]==‘Y‘) { Y.x=i; Y.y=j; } if(mp[i][j]==‘M‘) { M.x=i; M.y=j; } } } bfs(0); //Y的路线 bfs(1); //M的路线 int ans=INF; //最小步数 for(int i=0; i <n; i++)//搜一遍地图,看一下"@"所在地方的时间之和,取最小值 for(int j=0; j<m; j++) if(mp[i][j]==‘@‘) ans=min(ans,ytime[i][j]+mtime[i][j]); cout<<11*ans<<endl; } return 0; }
标签:har tar ret 输出 mtime eof oid lsh tps
原文地址:https://www.cnblogs.com/sky-stars/p/11140928.html