zoukankan      html  css  js  c++  java
  • P1514 引水入城

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct def1
    {
    	int x;
    	int y;
    } q[3000000];
    struct def2
    {
    	int len;
    	int x;
    	int y;
    } val[550];
    int dctx[6]= {0,1,0,-1,0},dcty[6]= {0,0,1,0,-1};
    int n,m,h=0,t=0,cnt=0,height[550][550];
    bool vis[550][550];
    bool cmp(def2 a,def2 b)
    {
    	if(a.x==0)return false;
    	if(b.x==0)return true;
    	if(a.x!=b.x)return a.x<b.x;
    	else return a.y>b.y;
    }
    void bfs()
    {
    	memset(vis,0,sizeof(vis));
    	for(int i=1; i<=m; i++)
    	{
    		t++;
    		q[t].x=1;//行
    		q[t].y=i;//列
    		vis[1][i]=true;
    	}
    	while(h<=t)
    	{
    		h++;
    		for(int i=1; i<=4; i++)
    		{
    			int x=q[h].x+dctx[i];
    			int y=q[h].y+dcty[i];
    			if(height[q[h].x][q[h].y]>height[x][y]&&(!vis[x][y]))
    			{
    				t++;
    				q[t].x=x;
    				q[t].y=y;
    				vis[x][y]=true;
    			}
    		}
    	}
    }
    void dfs(int x,int y)
    {
    	vis[x][y]=true;
    	for(int i=1; i<=4; i++)
    	{
    		int tx=x+dctx[i],ty=y+dcty[i];
    		if(height[x][y]>height[tx][ty]&&vis[tx][ty]!=true)
    		{
    			dfs(tx,ty);
    		}
    	}
    }
    int main()
    {
    
    	memset(height,0x3f,sizeof(height));
    	cin>>n>>m;
    	for(int i=1; i<=n; i++)
    		for(int j=1; j<=m; j++)
    			cin>>height[i][j];
    	bfs();
    
    	for(int i=1; i<=m; i++)
    		if(!vis[n][i])
    			cnt++;
    	if(cnt!=0)
    	{
    		cout<<0<<endl<<cnt<<endl;
    		return 0;
    	}
    
    //	dfs确定一个点可覆盖的区间[x,y]
    //	for(int i=1;i<=n;i++)
    //	{
    //		for(int j=1;j<=m;j++)
    //		cout<<vis[i][j]<<' ';
    //		cout<<endl;
    //	}
    	cnt=0;
    	for(int i=1; i<=m; i++)
    	{
    		memset(vis,0,sizeof(vis));
    		dfs(1,i);
    		cnt++;
    		bool flag=false;
    		for(int j=1; j<=m; j++)
    		{
    			if(flag==false&&vis[n][j]==true)
    			{
    				flag=true;
    				val[cnt].x=val[cnt].y=j;
    			}
    			if(flag==true&&vis[n][j+1]==false)
    			{
    				val[cnt].y=j;
    				break;
    			}
    		}
    		val[cnt].len=val[cnt].y-val[cnt].x+1;
    	}
    
    
    //	贪心每次取最大覆盖区间
    	int maxn=1,tot=1,i=2;
    	sort(val+1,val+1+cnt,cmp);
    
    	for(int i=1; i<=cnt; i++)
    		cout<<val[i].x<<' '<<val[i].y<<endl;
    
    	while(val[maxn].y<m)
    	{
    		int tmp=maxn;
    		while(i<=m&&val[i].x<=val[maxn].y+1)
    		{
    			if(val[i].y>val[tmp].y) tmp=i;
    			i++;
    		}
    		maxn=tmp;
    		tot++;
    	}
    	cout<<1<<endl<<tot<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    学习 Apache FileMatchs 规则
    yii2 vendor/bower/jquery/dist not exist
    Ionic POST提交使用普通表单提交数据
    Yii2 在php 7.2环境下运行,提示 Cannot use ‘Object’ as class name
    Yii2 使用 npm 安装的包
    phpStorm 激活
    Chrome DNS_PROBE_FINISHED_NXDOMAIN
    Yii2 中使用ts
    Js 对 浏览器 的 URL的操作
    js 编码、解码与asp.net 编码、解码
  • 原文地址:https://www.cnblogs.com/widerg/p/7182903.html
Copyright © 2011-2022 走看看