zoukankan      html  css  js  c++  java
  • hdu 2612 Find a way

    点击打开链接

    两个BFS即可。。


    #include"stdio.h"
    #include"string.h"
    #include"queue"
    #define N 205
    using namespace std;
    char str[N][N];
    int n,m,a1[1004]={0},a2[1004]={0};
    int sum,k,b1[1004]={0},b2[1004]={0};
    int map[N][N];
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    struct node 
    {
    	int x,y,step;
    };
    struct ss
    {
    	int x,y;
    }s[1004];
    int join(int x,int y)
    {
    	int i;
    	for(i=1;i<k;i++)
    		if(s[i].x==x&&s[i].y==y)
    			return i;
    		return -1;
    }
    void bfs1(int x,int y)
    {
    	queue<node>Q;
    	node q,p;
    	p.x=x;
    	p.y=y;
    	p.step=0;
    	memset(map,0,sizeof(map));
    	int t,i;
    	map[x][y]=0;
    	Q.push(p);
    	while(!Q.empty())
    	{
    		p=Q.front();
    		Q.pop();
    		t=join(p.x,p.y);
    		if(t)
    		{
    			map[p.x][p.y]=1;
    			a1[t]=p.step;
    		}
    		for(i=0;i<4;i++)
    		{
    			q=p;
    			q.x+=dir[i][0];
    			q.y+=dir[i][1];
    			q.step+=11;
    			if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
    				&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
    			{
    				map[q.x][q.y]=1;
    				Q.push(q);
    			}
    		}
    		for(i=1;i<k;i++)
    		{
    			if(a1[i])b1[i]=a1[i];
    			else b1[i]=-1;
    		}
    	}
    }
    void bfs2(int x,int y)
    {
    	queue<node>Q;
    	node q,p;
    	p.x=x;
    	p.y=y;
    	p.step=0;
    	memset(map,0,sizeof(map));
    	int t,i;
    	map[x][y]=0;
    	Q.push(p);
    	while(!Q.empty())
    	{
    		p=Q.front();
    		Q.pop();
    		t=join(p.x,p.y);
    		if(t)
    		{
    			map[p.x][p.y]=1;
    			a2[t]=p.step;
    		}
    		for(i=0;i<4;i++)
    		{
    			q=p;
    			q.x+=dir[i][0];
    			q.y+=dir[i][1];
    			q.step+=11;
    			if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
    				&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
    			{
    				map[q.x][q.y]=1;
    				Q.push(q);
    			}
    		}
    		for(i=1;i<k;i++)
    		{
    			if(a2[i])b2[i]=a2[i];
    			else b2[i]=-1;
    		}
    	}
    }
    int main()
    {
    	int i,j;
    	int x1,x2,y1,y2,min;
    	while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
    	{
    		k=1;
    		min=100000;
    		for(i=0;i<n;i++)
    			scanf("%s",str[i]);
    		for(i=0;i<n;i++)
    		{
    			for(j=0;j<m;j++)
    			{
    				if(str[i][j]=='Y')
    				{
    					x1=i;y1=j;
    				}
    				if(str[i][j]=='M')
    				{
    					x2=i;y2=j;
    				}
    				if(str[i][j]=='@')
    				{
    					s[k].x=i;
    					s[k++].y=j;
    				}
    			}
    		}
    			bfs1(x1,y1);
    			bfs2(x2,y2);
    			for(i=1;i<k;i++)
    			{
    				if(b1[i]!=-1&&b2[i]!=-1)
    				{
    					sum=b1[i]+b2[i];
    					if(min>sum)
    						min=sum;
    				}
    			}
    			printf("%d\n",min);
    	}
    	return 0;
    }
    
    
    
    
    
    


  • 相关阅读:
    STL堆实现
    Project Loom:Reactive模型和协程进行时(翻译)
    2020年最佳Java调试工具(翻译)
    布隆过滤器-使用场景的思考
    Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)
    使用Merkle树检测数据不一致(翻译)
    cassandra中的ACID,与RDBMS中的事务有何不同?
    Cassandra数据建模中最重要的事情:主键
    认证授权-学习笔记2-OpenId Connect
    jwt的思考
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365402.html
Copyright © 2011-2022 走看看