题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198

dfs:

 1 #include<cstdio>//hdu1198 dfs
 2 #include<cstring>
 3
 4 int well[11][5] = { {1,1,1,0,0},{1,0,1,1,0},{0,1,1,0,1},{0,0,1,1,1},{1,0,1,0,1},{0,1,1,1,0},{1,1,1,1,0},{1,1,1,0,1},{0,1,1,1,1},{1,0,1,1,1},{1,1,1,1,1}};
 5
 6 const int ca[5][2] = {0,1,1,0,1,1,1,2,2,1}, mov[4][2] = {1,0,-1,0,0,1,0,-1};
 7 int m,n,sum, map[550][550],id[550][550];
 8
 9 void build(int set, int x, int y)
10 {
11     for(int k = 0; k<5; k++)
12     {
13         if(well[set][k])
14         {
15             map[3*x+ca[k][0]][3*y+ca[k][1]] = 1;
16         }
17     }
18 }
19
20 void dfs(int x, int y, int iden)
21 {
22     id[x][y] = iden;
23     for(int i = 0; i<4; i++)
24     {
25         int xx = x + mov[i][0], yy = y + mov[i][1];
26         if(xx<0 || xx>3*m-1 || yy<0 || yy>3*n-1 ) continue;
27         if(map[xx][yy] && !id[xx][yy])
28         dfs(xx,yy,iden);
29     }
30 }
31
32 int main()
33 {
34     char init[5005];
35     while(scanf("%d%d",&m,&n) && (m!=-1 || n!=-1 ))
36     {
37         memset(map,0,sizeof(map));
38         memset(id,0,sizeof(id));
39         for(int i = 0; i<m; i++)
40         {
41             scanf("%s",init);
42             for(int j = 0; j<n; j++)
43             build(init[j]-65,i,j);
44         }
45         sum = 0;
46         for(int i = 0; i<=3*m-1; i++)
47         {
48
49             for(int j = 0; j<=3*n-1; j++)
50             {
51                 //printf("%d ",map[i][j]);
52                 if(map[i][j] && !id[i][j])
53                 {
54                     dfs(i,j,++sum);
55                 }
56             }
57             //putchar('\n');
58         }
59
60         printf("%d\n",sum);
61
62     }
63     return 0;
64 }

View Code

并查集:

 1 #include<cstdio>//hdu1198 并查集 每个格子的标号为i*n+j,初始father也为i*n+j,以次来作为合并集合的依据
 2 #include<cstring>
 3
 4 int n,m,father[55][55];
 5 char map[55][55];
 6 char type[11][5]={"1010","1001","0110","0101","1100","0011",
 7                "1011","1110","0111","1101","1111"};
 8
 9 int find(int x)
10 {
11     return (x==father[x/n][x%n])?x:find(father[x/n][x%n]);
12 }
13
14 int unit(int a, int b)
15 {
16     a = find(a);
17     b = find(b);
18     if(a!=b)//合并集合
19         father[a/n][a%n] = b;
20 }
21
22
23 int judge(int i, int j)
24 {   //判断是否与左边相连
25     if(j>0 && type[map[i][j]-'A'][2]=='1' && type[map[i][j-1]-'A'][3]=='1')
26         unit(i*n+j,i*n+j-1);
27     //判断是否与上边相连
28     if(i>0 && type[map[i][j]-'A'][0]=='1' && type[map[i-1][j]-'A'][1]=='1')
29         unit(i*n+j,(i-1)*n+j);
30 }
31
32 int main()
33 {
34     while(scanf("%d%d",&m,&n) && (m!=-1 || n!=-1))
35     {
36         for(int i = 0; i<m; i++)
37         {
38             scanf("%s",&map[i]);
39             for(int j = 0; j<n; j++)
40             {   //初始化为自己
41                 father[i][j] = i*n+j;
42             }
43         }
44
45         //并查集过程
46         for(int i = 0; i<m; i++)
47         for(int j = 0; j<n; j++)
48         judge(i,j);
49
50         int sum = 0;
51         for(int i = 0; i<m; i++)
52         for(int j = 0; j<n; j++)//看看有多少个“根节点”
53             if(father[i][j]==i*n+j) sum++;
54
55         printf("%d\n",sum);
56     }
57
58 }

View Code

转载于:https://www.cnblogs.com/DOLFAMINGO/p/7538774.html

hdu1198 Farm Irrigation —— dfs or 并查集相关推荐

  1. 大力飞砖之DFS与并查集(中-下)

    文章目录 前言 并查集 集合表示法 树状表示法 Parent "数组" 组装模板 DFS搜索并查集 题目 手动搜索 转换计算机 (补充)基于"交换数组位置的全排列&quo ...

  2. 一笔画问题 (DFS或并查集)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=42 一笔画问题是欧拉回路的一个变形,可以一笔画的条件有两个:1.所有顶点必须连通  2. ...

  3. hdu1181变形课dfs/bfs/并查集三种解法(java)

    题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...

  4. [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]

    [问题描述] 第200题 岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量.岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成 ...

  5. 【牛客 - 373C】抓捕盗窃犯(连通图,思维,dfs 或 并查集)

    题干: 链接:https://ac.nowcoder.com/acm/contest/373/C 来源:牛客网 Q市发生了一起特大盗窃案.这起盗窃案是由多名盗窃犯联合实施的,你要做的就是尽可能多的抓捕 ...

  6. 【51Nod - 1416】两点 (dfs 或 并查集+dfs)

    题干: 福克斯在玩一款手机解迷游戏,这个游戏叫做"两点".基础级别的时候是在一个n×m单元上玩的.像这样:     每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜 ...

  7. hdu dfs入门java_hdu1181变形课dfs/bfs/并查集三种解法(java)

    题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...

  8. 牛客编程巅峰赛S1第3场 - 黄金钻石 A.简单题 B.dfs C.并查集

    链接:https://ac.nowcoder.com/acm/contest/6383/A 来源:牛客网 找卧底 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语 ...

  9. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 2.3 并查集 1. 题目 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1. 线缆用 connection ...

最新文章

  1. DeepMind最新发现!神经网络的性能竟然优于神经符号模型
  2. ExtJS的xtype列表
  3. mysql数据万能导入工具下载_mysql数据导入工具下载 - 数据导入工具(EMS Data Export for MySQL) v3.7.0多语特别版下载 - 第九软件网...
  4. GDCM:gdcm::Command的测试程序
  5. 腾讯TencentOS 十年云原生的迭代演进之路
  6. 10 个十分难得的 javascript 开发经验
  7. 2011年1月MVP申请将于10月13日截止
  8. 文件字符输入流 java
  9. as3调用java_java与as3.0中for each使用的小陷阱
  10. 深度学习2.0-30.卷积神经网络之池化与采样
  11. mac下安装nginx及相关配置
  12. android通用对话框,android-所有活动中的“通用”对话框
  13. Hi3861开发板搭建环境
  14. regsvr32注册Dll文件时出现0x80004005问题的解决方案
  15. EPLAN教程——导出CAD如何快捷配置
  16. 用FlashFXP上传文件到SSH服务器,附FlashFXP显示中文乱码的解决方法
  17. 抢购秒杀处理方案、分析热点数据
  18. 数据字典的主要作用是什么?
  19. HTML css把图片变圆,HTML+CSS:圆形和圆角图片格式
  20. python调用金山词霸的api

热门文章

  1. Java获得随机数字
  2. 阿里云linux服务器初步使用
  3. 这些心智程序你安装了吗?
  4. 【快乐水题】509. 斐波那契数
  5. nacos 配置中心和注册中心依赖后报错,提示 org.apache.http.impl.client.HttpClientBuilder 这个类找不到
  6. PS菜鸟入门 -- 窗口
  7. mkimage工具讲解
  8. C语言再学习 -- linux 压缩与解压缩含义
  9. Bit-Z 关于交易隐藏及下线说明
  10. 参考平面及其高度_GCB | 盐沼和红树林湿地类型的转变会改变亚热带湿地对于海平面上升的脆弱性么?...