zhber
有好多做过的题没写下来,如果我还能记得就补吧

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\n",piece);
}
int main()
{
	freopen("farm.in","r",stdin);
	freopen("farm.out","w",stdout);
	while (scanf("%d%d",&n,&m)&&n+1&&m+1)work();
} 


posted on 2014-08-04 22:17  zhber  阅读(182)  评论(0编辑  收藏  举报