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(); }