• HDU2612 Find a way 双向BFS


    网址:https://vjudge.net/problem/HDU-2612

    题意:

    地图上分布着一些KCF(?),有两个人在其出发点,地图上‘#’表示不能走的格子, ‘.’表示可以走的格子,‘@’表示可行的目的地。两个人从出发点出发,移动一个需要代价是$1$,并且不能经过对方的出发点,求代价和的最小值。

    题解:

    建好图之后对这两个人跑一次bfs然后枚举最小值即可。

    AC代码:

    #include <iostream> 
    #include <queue>
    #include <cstring>
    using namespace std;
    int dep1[40005],dep2[40005];
    char ch[205][205];
    int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    int n,m,l,a,b;
    int res[40005];
    bool check(int x,int y,char s)
    {
    	if(x>=n||x<0||y>=m||y<0)
    		return false;
    	if(ch[x][y]=='#'||ch[x][y]==s)
    		return false;	
    	return true;	
    }
    void print(int *dep)
    {
    	for(int i=0;i<n;++i)
    	{
    		for(int j=0;j<m;++j)
    			cout<<dep[i*m+j]<<" ";
    		cout<<endl;	
    	}
    }
    void bfs(int s,int *dep,char k)
    {
    	queue<int>que;
    	dep[s]=1;
    	que.push(s);
    	while(!que.empty())
    	{
    		int t=que.front();
    		que.pop();
    		//cout<<"t="<<t<<endl;
    		int x=t/m,y=t%m;
    		//cout<<x<<" "<<y<<endl;
    		for(int i=0;i<4;++i)
    		{
    			if(check(x+dir[i][0],y+dir[i][1],k))
    				if(dep[(x+dir[i][0])*m+y+dir[i][1]]==0)
    				{
    					//cout<<(x+dir[i][0])*m<<" "<<y+dir[i][1]<<endl;
    					dep[(x+dir[i][0])*m+y+dir[i][1]]=dep[t]+1;
    					que.push((x+dir[i][0])*m+y+dir[i][1]);
    					//print(dep);
    					//cout<<endl;
    				}
    		}	
    	}
    	//cout<<endl; 
    }
    void solve()
    {
    	int ans=0x3f3f3f3f;
    	for(int i=0;i<l;++i)
    		if(dep1[res[i]]&&dep2[res[i]]&&ans>dep1[res[i]]+dep2[res[i]])
    			ans=dep1[res[i]]+dep2[res[i]];
    	cout<<(ans-2)*11<<endl;		
    }
    int main()
    {
    	while(cin>>n>>m)
    	{
    		memset(ch,0,sizeof(ch));
    		memset(dep1,0,sizeof(dep1));
    		memset(dep2,0,sizeof(dep2)); 
    		l=0;
    		for(int i=0;i<n;++i)
    			for(int j=0;j<m;++j)
    			{
    				cin>>ch[i][j];	
    				if(ch[i][j]=='Y')
    					a=i*m+j;
    				else if(ch[i][j]=='M')
    					b=i*m+j;
    				else if(ch[i][j]=='@')
    					res[l++]=i*m+j;	
    			}
    		/*for(int i=0;i<n;++i)
    		{
    			for(int j=0;j<m;++j)
    				cout<<ch[i][j]<<" ";
    			cout<<endl;	
    		}
    		cout<<l<<" "<<a<<" "<<b<<" "<<endl;
    		for(int i=0;i<l;++i)
    			cout<<res[i]<<endl;*/
    		bfs(a,dep1,'M');
    		bfs(b,dep2,'Y');
    		solve();
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何构建积木式Web应用
    ASP.NET 2.0 异步页面原理浅析 [1] [原]
    HybridDictionary 类
    datagrid自定义
    认识.NET的集合
    织梦 10060
    java.io.FileNotFoundException: E:\temp (拒绝访问。)
    引用与对象实例化
    C#中为DataGrid添加下拉列表框
    C#中使用指针
  • 原文地址:https://www.cnblogs.com/Aya-Uchida/p/11300671.html
Copyright © 2020-2023  润新知