Farm Irrigation

题目链接:              杭电oj 1198

题目说明:

此方法主要是利用了搜索的思路来归并所有能够连通的管道。

题目描述:

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.

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

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.

输入:

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.

输出:

For each test case, output in one line the least number of wellsprings needed.

样例输入:

2 2

DK

HF

3 3

ADC

FJK

IHE

-1 -1

样例输出:

2

3

代码:

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#define MAX 55
using namespace std;
char map[MAX][MAX];
int judge[MAX][MAX]={0};
int N,M;
int ans;//水源个数
int square[11][4]={{1,0,0,1},//A   0{1,1,0,0},//B  1{0,0,1,1},//C  2{0,1,1,0},//D  3{1,0,1,0},//E  4{0,1,0,1},//F  5{1,1,0,1},//G  6{1,0,1,1},//H  7   {0,1,1,1},//I   8{1,1,1,0},//J  9{1,1,1,1},//K  10};    //定义管道的11种结构 int dir[4][2]={{-1,0},//上 {0,1},//右 {1,0},//下 {0,-1},//左 };//定义4个搜索方向 typedef struct Element
{int x;int y;char elem;
}Element; //以结构体来存元素的信息 Element elem;
Element elem_deal;
queue<Element> q;//定义队列容器用以处理数据
Element x;void drow_map()           //录入地图
{int i,j;for(i=0;i<N;i++){getchar();for(j=0;j<M;j++){cin>>map[i][j];}    }}void print()       //输出处理过后的数据,此题无需用到
{int i,j;for(i=0;i<N;i++){for(j=0;j<M;j++){cout<<judge[i][j];}    cout<<endl;}cout<<endl;
}void queue_deal(Element x) //利用队列来对农场管道进行处理
{int i,j,t;q.push(x);while(!q.empty()){elem=q.front();     //取队首元素 judge[elem.x][elem.y]=ans;//把能连通的区域用同一数值表示 q.pop();            //队首元素出队 {for(i=0;i<4;i++){t=i+2;//用以判断缺口 if(square[elem.elem-'A'][i]==0)       //判断管道是否在此方向有缺口 {continue;}else{elem_deal.x=elem.x+dir[i][0];elem_deal.y=elem.y+dir[i][1];if(elem_deal.x<N&&elem_deal.x>=0&&elem_deal.y<M&&elem_deal.y>=0&&judge[elem_deal.x][elem_deal.y]==0)//判断是否越界或被处理过 {elem_deal.elem=map[elem_deal.x][elem_deal.y];if(t>=4)t=t%4;if(square[elem_deal.elem-'A'][t]==1)//判断被连接的管道是否在相反的方向有缺口 q.push(elem_deal);}}  }}}ans++;
}void deal()        //处理
{int i,j;ans=1;for(i=0;i<N;i++)for(j=0;j<M;j++){if(judge[i][j]==0){x.x=i;x.y=j;x.elem=map[i][j];queue_deal(x);}elsecontinue;        }
}int main()
{while(1){cin>>N>>M;if(N==-1&&M==-1)break;drow_map();deal();cout<<ans-1<<endl;memset(map,'0',sizeof(map));memset(judge,0,sizeof(judge));}
return 0;
}

杭电oj-----Farm Irrigation(BFS)相关推荐

  1. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  2. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  3. 地下城夺宝游戏——杭电OJ 1044题解析

    题目来源:杭电OJ-1044 题目大意:一个探险家身处一个危险的地下城,城中很危险,并且城中分散着若干个珠宝:现在地下城即将塌陷,冒险家需要在有限的时间内逃出去,但他希望在逃生的过程中获取一些珠宝并使 ...

  4. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  5. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  6. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  7. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  8. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  9. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

  10. 【ACM】杭电OJ 1003。

    运行环境VS2017  题目链接:杭电OJ 1003 主要思想是: 用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin 然而在程序42行的疑问,大家可以讨论一下吗???? ...

最新文章

  1. python程序如何执行死刑图片_如何判断对象已死
  2. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化
  3. .NET 6 新特性 PeriodicTimer
  4. Spring框架相关问题
  5. html匹配属性正则表达式,正则表达式匹配html标签的属性值
  6. 【视频教程】JEECG 入门视频教程大全+历史版本代码下载
  7. 关于OpenCV的那些事——相机姿态更新
  8. Eclipse 皮肤
  9. 1356. 根据数字二进制下 1 的数目排序
  10. AlexNet、VGG16、ResNet网络结构图
  11. oracle误删表恢复方法
  12. 密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记
  13. BibTex中参考文献种类
  14. Nginx常用Rewrite(伪静态规则)WordPress/PHPCMS/ECSHOP/ShopEX/SaBlog/Discuz/DiscuzX/PHPWind/Typecho/DEDECMS...
  15. Js(二)SyntaxError Cannot use import statement outside a module
  16. java8新特性学习笔记之唠唠“匿名内部类与lambda”
  17. 将自己的 ubuntu 系统制作为ISO镜像
  18. Matlab 主曲率、平均曲率、高斯曲率
  19. 吃饱没事做之——爬楼梯题复杂化
  20. 调整文字框顺序,返回顺时针或逆时针顺序

热门文章

  1. fork和vfork,exec
  2. What is a TensorFlow Session?
  3. csdn肿么了,这两天写的博文都是待审核
  4. 在dll中用DirectSound8同时播放多个wav文件不能发声
  5. pg库使用dblink连接mysql_PG-跨库操作-dblink
  6. 计算机是根据用户名,根据用户名移动计算机账号
  7. phpstom可以配置php环境吗_环境配置 · PhpStorm · 看云
  8. 5-vue-template模板制作
  9. C# 中用 PadLeft、PadRight 补足位数
  10. 理解 __doPostBack--2