• 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;
    
    }
    
     


  • 相关阅读:
    Pycharm 2016 注册码
    在mac上搭建python环境
    Carthage 的使用
    生成唯一的随机字符串
    utf-8 转码--网址转码
    让自己的项目支持 Carthage
    系统自带的语音合成
    个性化 UIAlertController
    cocoaPods 创建自己的依赖库
    appleDoc 使用
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3144771.html
Copyright © 2020-2023  润新知