zoukankan      html  css  js  c++  java
  • HDU/HDOJ 2612 Find a way 双向BFS

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

    思路:从两个起点出发,有多个终点,求从两个起点同时能到达的终点具有的最小时间,开两个数组分别保存两个起点到达每一个终点的用时,最后将两个

    数组里的时间加起来求最小的一组,必须对应相加,因为终点必须同时到达。

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    #include <sstream>
    #include <cstdlib>
    #include <fstream>
    #include <queue>
    using namespace std;
    struct node{
    	int x,y,step;
    }a[1010];
    node p,q;
    int n,m,sx1,sy1,sx2,sy2,ans1[1010],ans2[1010],ans[1010];
    int mmin,cnt;
    int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};  
    char maze[205][205];
    bool visit[205][205];
    int judge(int x,int y){
    	for(int i=1;i<cnt;i++)
    	{
    		if(x==a[i].x&&y==a[i].y)return i;
    	}
    	return 0;
    }
    void bfs1(int x,int y){
    	memset(ans,0,sizeof(ans));
    	memset(ans1,-1,sizeof(ans1));
    	memset(visit,0,sizeof(visit));
    	queue<node> Q;
    	p.x=x;
    	p.y=y;
    	p.step=0;
    	Q.push(p);
    	visit[p.x][p.y]=1;
    	while(!Q.empty())
    	{
    		p=Q.front();
    		Q.pop();
    		int num=judge(p.x,p.y);
    		if(num){
    			ans[num]=p.step;
    			visit[p.x][p.y]=1;
    		}
    		for(int i=0;i<4;i++)
    		{
    			q.x=p.x+dir[i][0];
    			q.y=p.y+dir[i][1];
    			q.step=p.step+1;
    			if(q.x<0||q.x>=n||q.y<0||q.y>=m)continue;
    			if(visit[q.x][q.y])continue;
    			if(maze[q.x][q.y]=='#')continue;
    			Q.push(q);
    			visit[q.x][q.y]=1;
    		}
    	}
    	for(int i=1;i<cnt;i++){
    		if(ans[i])ans1[i]=ans[i];
    	}
    	
    }
    void bfs2(int x,int y){
    	memset(ans,0,sizeof(ans));
    	memset(ans2,-1,sizeof(ans2));
    	memset(visit,0,sizeof(visit));
    	queue<node> Q;
    	p.x=x;
    	p.y=y;
    	p.step=0;
    	Q.push(p);
    	visit[p.x][p.y]=1;
    	while(!Q.empty())
    	{
    		p=Q.front();
    		Q.pop();
    		int num=judge(p.x,p.y);
    		if(num){
    			ans[num]=p.step;
    			visit[p.x][p.y]=1;
    		}
    		for(int i=0;i<4;i++)
    		{
    			q.x=p.x+dir[i][0];
    			q.y=p.y+dir[i][1];
    			q.step=p.step+1;
    			if(q.x<0||q.x>=n||q.y<0||q.y>=m)continue;
    			if(visit[q.x][q.y])continue;
    			if(maze[q.x][q.y]=='#')continue;
    			Q.push(q);
    			visit[q.x][q.y]=1;
    		}
    	}
    	for(int i=1;i<cnt;i++){
    		if(ans[i])ans2[i]=ans[i];
    	}
    }
    int main()
    {
    	//ifstream fin;
    	//fin.open("data1.txt");
    	
    	while(cin>>n>>m)
    	{
    		cnt=1;
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++){
    				cin>>maze[i][j];
    				if(maze[i][j]=='Y'){
    					sx1=i;
    					sy1=j;
    				}
    				if(maze[i][j]=='M'){
    					sx2=i;
    					sy2=j;
    				}
    				if(maze[i][j]=='@'){
    					a[cnt].x=i;
    					a[cnt++].y=j;
    				}
    			}
    			mmin=999999;
    			bfs1(sx1,sy1);
    			bfs2(sx2,sy2);
    			for(int i=1;i<cnt;i++)
    			{
    				if(ans1[i]!=-1&&ans2[i]!=-1){
    					int tsum=ans1[i]+ans2[i];
    					if(mmin>tsum)mmin=tsum;
    				}
    			}
    			cout<<mmin*11<<endl;
    	}
    	return 0;
    
    }
    
     


  • 相关阅读:
    PHP 命令行参数解析工具类
    【日本软件外包】设计书中常用到的文型
    php沙盒测试 http://sandbox.onlinephpfunctions.com/ SQL语句格式化 https://www-atl.blog.so-net.ne.jp/2015-02-08
    intra-mart
    maven安装和eclipse集成
    MyEclipse破解
    pdf 中画虚线
    方法名同类名相同如果没有__construct,会被当做构造函数。
    ESA2GJK1DH1K微信小程序篇: 源码使用注意事项和程序优化
    GPRS(Air202) Lua开发: OLED显示二维码,信号强度,电池电量
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3144771.html
Copyright © 2011-2022 走看看