Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked from A to K, as Figure 1 shows.

Farm Irrigation

Figure 1

Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map

ADC
FJK
IHE

then the water pipes are distributed like


Figure 2

Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn.

Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him?

Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.

 
Input
There are several test cases! In each test case, the first line contains 2 integers M and N, then M lines follow. In each of these lines, there are N characters, in the range of 'A' to 'K', denoting the type of water pipe over the corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.
 
Output
For each test case, output in one line the least number of wellsprings needed.
 
Sample Input
2 2 DK HF 3 3 ADC FJK IHE -1 -1
 
Sample Output
2 3
 
Author
ZHENG, Lu
 
Source
 
Recommend
Ignatius.L
 
 
 
解题思路
并查集分类问题,将其分堆,等于本身的便是总共的个数

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char a[55][55];
int pd[2505];
struct node
{
    int l;
    int r;
    int u;
    int d;
    int num;
}que[55][55];
int get(int x)
{
    if(pd[x]!=x)
        pd[x]=get(pd[x]);
    return pd[x];
}
void find(int x,int y)
{
    pd[get(y)]=get(x);
}
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
         if(m==-1&&n==-1)
            break;
            if(m==1&&n==1)
            {
                printf("1\n");
                continue;
            }
        memset(pd,0,sizeof(pd));
        memset(a,0,sizeof(a));
        int N=n*m;
        for(int i1=1;i1<=N;i1++)
            pd[i1]=i1;
        getchar();
        for(int i2=0;i2<m;i2++)
        {
            for(int j2=0;j2<n;j2++)
                scanf("%c",&a[i2][j2]);
                getchar();
        }
        int h=1;
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            if(a[i][j]=='A') {que[i][j].l=1;que[i][j].r=0;que[i][j].u=1;que[i][j].d=0;}
            else if(a[i][j]=='B') {que[i][j].l=0;que[i][j].r=1;que[i][j].u=1;que[i][j].d=0;}
            else if(a[i][j]=='C') {que[i][j].l=1;que[i][j].r=0;que[i][j].u=0;que[i][j].d=1;}
            else if(a[i][j]=='D') {que[i][j].l=0;que[i][j].r=1;que[i][j].u=0;que[i][j].d=1;}
            else if(a[i][j]=='E') {que[i][j].l=0;que[i][j].r=0;que[i][j].u=1;que[i][j].d=1;}
            else if(a[i][j]=='F') {que[i][j].l=1;que[i][j].r=1;que[i][j].u=0;que[i][j].d=0;}
           else if(a[i][j]=='G') {que[i][j].l=1;que[i][j].r=1;que[i][j].u=1;que[i][j].d=0;}
           else if(a[i][j]=='H') {que[i][j].l=1;que[i][j].r=0;que[i][j].u=1;que[i][j].d=1;}
           else if(a[i][j]=='I') {que[i][j].l=1;que[i][j].r=1;que[i][j].u=0;que[i][j].d=1;}
           else if(a[i][j]=='J') {que[i][j].l=0;que[i][j].r=1;que[i][j].u=1;que[i][j].d=1;}
            else {que[i][j].l=1;que[i][j].r=1;que[i][j].u=1;que[i][j].d=1;}
            que[i][j].num=h;
            h++;
        }
        for(int i3=0;i3<m;i3++)
        for(int j3=0;j3<n;j3++)
        {
            if(j3<n-1)
            {
                if(que[i3][j3].r==1&&que[i3][j3+1].l==1)
                    find(que[i3][j3].num,que[i3][j3+1].num);
            }

if(i3<m-1)
            {
                if(que[i3][j3].d==1&&que[i3+1][j3].u==1)
                    find(que[i3][j3].num,que[i3+1][j3].num);
            }
        }
        int sum=0;
        for(int i4=1;i4<=N;i4++)
        {
            if(pd[i4]==i4)
                  sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}

HDU1198水管并查集Farm Irrigation的更多相关文章

  1. hdu1198 普通的并查集

    今天开始(第三轮)并查集,,之前学的忘了一些 本题很简单直接上代码 #include<iostream> #include<cstring> #include<cstdi ...

  2. hdu1198 Farm Irrigation —— dfs or 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 dfs: #include<cstdio>//hdu1198 dfs #includ ...

  3. hdu1198 Farm Irrigation 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 简单并查集 分别合并竖直方向和水平方向即可 代码: #include<iostream&g ...

  4. 【简单并查集】Farm Irrigation

    Farm Irrigation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tot ...

  5. HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  7. hdu-1198 Farm Irrigation---并查集+模拟(附测试数据)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目大意: 有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种 ...

  8. hdu 1198 Farm Irrigation(并查集)

    题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...

  9. 杭电OJ——1198 Farm Irrigation (并查集)

    畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可 ...

随机推荐

  1. Linq---左外联查询

    花了好半天才解决这个问题,终于在网上找到了答案,在此记录备份. 参考连接:http://bbs.csdn.net/topics/390150047 自己总结的如下: 结构就不说了,最后大家自己下源码看 ...

  2. z-index详解

    来源于:http://www.cnblogs.com/ForEvErNoME/p/3373641.html 概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的 ...

  3. Tomcat 部署

    <CATALINA_HOME>/webapps: Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录. 1.war包部署:  将需要发布的web应用打成war文件, ( ...

  4. Linux Kernel Synchronization && Mutual Exclusion、Linux Kernel Lock Mechanism Summarize

    目录 . 内核锁机制 . 同步与互斥 . 锁定内存总线原子操作 . 信号量 . 自旋锁 . RCU机制 . PERCPU变量 . 内存和优化屏障 . 读者/写者锁 . 大内核锁 . 互斥量 1. 内核 ...

  5. CVE-2014-0160 Heartbleed Vul Analysis && OpenSSL Cryptographic Software Library Bug

    目录 . Heartbleed漏洞简介 . 漏洞造成的风险和影响 . 漏洞的测试.POC . OpenSSL漏洞源代码分析 . 防御.修复方案 . 从漏洞中得到的攻防思考 1. Heartbleed漏 ...

  6. MySql批处理的小窍门:排行榜类数据生成

    MySql批处理的小窍门:排行榜类数据生成 最近在做新版本的开发,其中涉及到排行榜的批量预生成,在此分享给大家. 关键点 名次的计算(不考虑用游标) 单榜单查询 对于排行榜这种类型的数据,当只查一个排 ...

  7. Java线程中run和start方法的区别

    http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法 ...

  8. 架构(Architecture)和框架(Framework)杂谈

    1. 架构和框架的设计层次不同       类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图:        在这个图中我们可以看到,Framework处于Micro-archite ...

  9. Linux下不同机器之间的文件拷贝

    通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war   root@192.168.6.137:/usr/ ...

  10. iframe 动态onload事件处理方式

    转自:http://w3help.org/zh-cn/causes/SD9022 标准参考 关于 HTML 4.01 规范中 BODY 标记的 onload 属性说明: http://www.w3.o ...