首页 > 代码库 > HDU 2612 Find a way
HDU 2612 Find a way
bfs水题。
Y和M 一起出发 到达 @ 的位置。求最近的。
分别以Y和M做一次bfs 即可。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,n) for(int i= a;i< n ;i++) #define FOR0(i,a,b) for(int i=a;i>=b;i--) #define pb push_back #define mp make_pair #define ft first #define sd second #define acfun std::ios::sync_with_stdio(false) #define SIZE 200+1 using namespace std; int xx[]={0,0,-1,1}; int yy[]={-1,1,0,0}; int n,m; int g[SIZE][SIZE]; int a[SIZE][SIZE]; int b[SIZE][SIZE]; struct lx { int x,y,t; void init(int xx,int yy,int tt) { x=xx,y=yy,t=tt; } }Y,M; void bfs(lx start,int dis[][SIZE]) { bool vis[SIZE][SIZE]; CLR(vis,0); CLR(dis,0); vis[start.x][start.y]=1; queue<lx>q; q.push(start); while(!q.empty()) { lx tmp=q.front(); q.pop(); // printf("%d %d %c\n",tmp.x,tmp.y,g[tmp.x][tmp.y]); // system("pause"); FOR(k,0,4) { int x=tmp.x+xx[k]; int y=tmp.y+yy[k]; if(x<0||y<0||x>=n||y>=m||g[x][y]=='#'||vis[x][y])continue; lx now; vis[x][y]=1; now.init(x,y,tmp.t+1); dis[x][y]=now.t; q.push(now); } } } int main() { while(~scanf("%d%d",&n,&m)) { FOR(i,0,n) { char str[SIZE]; scanf("%s",str); FOR(j,0,m) { g[i][j]=str[j]; if(str[j]=='Y') Y.init(i,j,0); else if(str[j]=='M') M.init(i,j,0); } } bfs(Y,a); bfs(M,b); int ans=SIZE*SIZE; FOR(i,0,n) FOR(j,0,m) { if(g[i][j]!='@')continue; ans=min(ans,a[i][j]+b[i][j]); } printf("%d\n",ans*11); } }
HDU 2612 Find a way
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。