• 2014.8.3情人节欢乐赛【Benny的农场】


    Benny的农场

    (farm.pas/.c/.cpp)

    时间限制:1s。空间限制:128MB

    题目描述:

    Benny有一片农田需要灌溉。农田的形状为矩形,并被分为许多小块。每一块中都有一些水管。共有11种类型的管道,如右图所示标号为A到K。

    Benny有农场的地图,地图表明各小块中管道的形状。例如:

      ADC

     FJK

     IHE


    那么,整个农田的水管分布为下图:


    现在要在一些小块中心建几个水源,灌溉用的水可以从水源所在的小块开始,沿管道流向其他小块。只有水流穿过一个小块,这个小块才会有好收成。

    现在,Benny想知道至少要建多少个水源才能使整个农田收到灌溉。

    注意:在上面的例子中,至少需要3个水源(红点所示),这是建水源的其中一种方案。

    输入格式:

    每个测试点有多组测试数据!

    在每组测试数据中,第一行包含2个整数M和N,表示整块农田可分为M行N列的小块。接下来M行每行有N个字符,字符为“A”到“K”,表示每个小块的管道形状。

    输入数据以输入M和N均为-1结束。数据范围1<=M,N≤50。

    输出格式:

    对于每组测试数据,输出最少所需水源数。

    样例输入:

    2 2

    DK

    HF

    3 3

    ADC

    FJK

    IHE

    -1 -1

    样例输出:

    2

    3

    数据范围:10%的数据n,m<=5。30%的数据n,m<=50。100%的数据n,m<=500。40%的测试点最多不超过5组测试数据,100%的测试点最多不超过10组测试数据。


    情人节欢乐赛……好像一点也不欢乐

    这题直接读入完保存连通性,然后遍历一遍并查集水过……

    #include<cstdio>
    #include<cstring>
    #define MAX 300000
    int n,m;
    int fa[MAX];s
    bool link[MAX][4];
    inline int getfa(int x)
    {return fa[x]==x?x:fa[x]=getfa(fa[x]);}
    inline void work()
    {
    	char ch[510];
    	memset(link,0,sizeof(link));
    	int piece=n*m,now,d,fn,fd;
    	for (int i=1;i<=n*m;i++)fa[i]=i;
    	for (int i=1;i<=n;i++)
    	{
    	  scanf("%s",ch);
    	  for (int j=0;j<m;j++)
    		{
    		  now=(i-1)*m+j+1;
    		  char c=ch[j];
    		  if (c=='A'){link[now][1]=1;link[now][2]=1;continue;}
    		  if (c=='B'){link[now][2]=1;link[now][3]=1;continue;}
    		  if (c=='C'){link[now][1]=1;link[now][4]=1;continue;}
    		  if (c=='D'){link[now][3]=1;link[now][4]=1;continue;}
    		  if (c=='E'){link[now][2]=1;link[now][4]=1;continue;}
    		  if (c=='F'){link[now][1]=1;link[now][3]=1;continue;}
    		  if (c=='G'){link[now][1]=1;link[now][2]=1;link[now][3]=1;continue;}
    		  if (c=='H'){link[now][1]=1;link[now][2]=1;link[now][4]=1;continue;}
    		  if (c=='I'){link[now][1]=1;link[now][3]=1;link[now][4]=1;continue;}
    		  if (c=='J'){link[now][2]=1;link[now][3]=1;link[now][4]=1;continue;}
    		  if (c=='K'){link[now][1]=1;link[now][2]=1;link[now][3]=1;link[now][4]=1;}
    		}
    	}
    	for (int i=1;i<=n;i++)
    	  for (int j=1;j<=m;j++)
    	    {
    	    	now=(i-1)*m+j;
    	    	if (m-j)
    	    	{
    	    		d=(i-1)*m+j+1;
    	    		if (link[now][3]&&link[d][1])
    	    		{
    	    		fn=getfa(now);
    	    		fd=getfa(d);
    	    			if (fn!=fd)
    	    			{
    	    				piece--;
    	    				fa[fd]=fn;
    	    			}
    	    		}
    	    	}
    	    	if (n-i)
    	    	{
    	    		d=i*m+j;
    	    		if (link[now][4]&&link[d][2])
    	    		{
    	    			fn=getfa(now);
    	    			fd=getfa(d);
    	    			if (fn!=fd)
    	    			{
    	    				piece--;
    	    				fa[fd]=fn;
    	    			}
    				}
    	    	}
    	    }
    	printf("%d
    ",piece);
    }
    int main()
    {
    	freopen("farm.in","r",stdin);
    	freopen("farm.out","w",stdout);
    	while (scanf("%d%d",&n,&m)&&n+1&&m+1)work();
    } 
    


    ——by zhber,转载请注明来源
  • 相关阅读:
    oracle sql 优化大全
    MyBatis学习笔记
    Eclipse启动项目时,删除workspaces无用的工作区间
    java 中 BigDecimal 怎么与 0 比较
    Mybatis 异常: The content of elements must consist of well-formed character data or markup
    ODS与数据仓库
    MyBatis 缓存
    管理信息系统需求调研分析指南
    Merge Into 语句代替Insert/Update在Oracle中的应用实战
    Oracle数据库常用函数使用--持续更新中
  • 原文地址:https://www.cnblogs.com/zhber/p/4036013.html
Copyright © 2020-2023  润新知