Benny的农场

(farm.pas/.c/.cpp)

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

题目描述:

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

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

ADC

FJK

IHE

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

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

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

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

现在,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();
}
05-02 05:44