• CF590C Three States


    CF590C Three States

    题意翻译

    给你一个?×?的地图,’.’为荒地,’#’为石头,数字为国家,求最少将多少个荒地修为路可以将三个国家联通。无解输出‘-1’。


    题解:

    0/1BFS

    注意坑点是枚举到荒地的时候,要-2.

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int INF=0x3f3f3f3f;
    struct node
    {
    	int x,y;
    };
    int dx[5]={0,0,1,-1};
    int dy[5]={1,-1,0,0};
    char ch[1010][1010];
    int dis[1010][1010][5];
    bool vis[1010][1010]; 
    int n,m;
    long long minn=0x3f3f3f3f3f3f3f3f;
    void bfs(int s)
    {
    	deque<node> q;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			if(ch[i][j]-'0'==s)
    			{
    				dis[i][j][s]=0;
    				q.push_back((node){i,j});
    			}
    	while(q.size())
    	{
    		node u=q.front();
    		q.pop_front();
    		int x=u.x;
    		int y=u.y;
    		for(int i=0;i<4;i++)
    		{
    			int xx=x+dx[i];
    			int yy=y+dy[i];
    			if(xx<1||xx>n||dis[x][y][s]+1>=dis[xx][yy][s]||yy<1||yy>m||ch[xx][yy]=='#')
    				continue;
    			if(ch[xx][yy]=='.')//标准01BFS
    			{
    				dis[xx][yy][s]=dis[x][y][s]+1;
    				q.push_back((node){xx,yy});
    			}
    			else 
    			{
    				dis[xx][yy][s]=dis[x][y][s];
    				q.push_front((node){xx,yy});
    		    }
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>ch[i][j];
    	memset(dis,INF,sizeof(dis));
    	bfs(1);
    	bfs(2);
    	bfs(3);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    		{
    			long long cost=1ll*dis[i][j][1]+dis[i][j][2]+dis[i][j][3];
    			if(ch[i][j]=='.')
    				cost-=2;	
    			minn=min(minn,cost);
    		}
    	if(minn>=INF)
    		cout<<"-1";
    	else 
    		cout<<minn;
    	return 0;
    } 
    
  • 相关阅读:
    Java学习笔记——继承、接口、多态
    Java学习笔记,前两章总结
    网络攻防第十一周总结
    第十一周网络攻防作业
    第十周网络作业
    第九周网络攻防作业
    第八周网络攻防作业
    第七周网络攻防作业
    第六周网络攻防作业
    第五周网络攻防作业
  • 原文地址:https://www.cnblogs.com/fusiwei/p/14029135.html
Copyright © 2020-2023  润新知