hdu 1198 (并查集 or dfs) Farm Irrigation
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198
有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇水,问需要打多少口井
比如
ADC
FJK
IHE是下图这种情况
需要打三口井,其实想多了就是集合合并差不多,用并查集可以解决,将每个格子按顺序是从0到n*m-1,然后根据连接情况判断是否相连然后合并
第一次写成了暴力的,虽然一遍过了,但是觉得太长了,然后又改成了下面简洁并查集的,还有下下面的dfs的
并查集
#include<cstdio>
using namespace std;
char yj[][];
int father[*+];
int dir[][]={{,,,},{,,,},{,,,},
{,,,},{,,,},{,,,},
{,,,},{,,,},{,,,},
{,,,},{,,,}};
void give(int x)
{
for (int i=;i<x;i++)
father[i]=i;
}
int _find(int x)
{
if (x==father[x]) return father[x];
father[x]=_find(father[x]);
return father[x];
}
int merge(int x,int y)
{
int sx=_find(x);
int sy=_find(y);
if (sx!=sy)
father[sx]=sy;
}
int main()
{
int n,m,i,j;
while (~scanf("%d %d",&n,&m))
{
if (n==-&&m==-) break;
for (i=;i<n;i++)
scanf("%s",yj[i]);
give(n*m);
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
int x=yj[i][j]-'A';
int y=yj[i][j+]-'A';
if (dir[x][]==&&dir[y][]==&&j+<m)
merge(i*m+j,i*m+j+);
y=yj[i+][j]-'A';
if (dir[x][]==&&dir[y][]==&&i+<n)
merge(i*m+j,(i+)*m+j);
}
}
int sum=;
for (i=;i<n*m;i++)
if (father[i]==i)
sum++;
printf("%d\n",sum);
}
return ;
}
dfs
#include<cstdio>
#include<cstring>
using namespace std;
int dx[]={,-,,};//下上左右
int dy[]={,,-,};
char yj[][];
int ans,vis[][],n,m;
int dir[][]={{,,,},{,,,},{,,,},
{,,,},{,,,},{,,,},
{,,,},{,,,},{,,,},
{,,,},{,,,}};
int check(int x,int y,int di)
{
if (dir[x][]&&dir[y][]&&di==) return ;
if (dir[x][]&&dir[y][]&&di==) return ;
if (dir[x][]&&dir[y][]&&di==) return ;
if (dir[x][]&&dir[y][]&&di==) return ;
return ;
}
void dfs(int x,int y)
{
int i;
if (vis[x][y]) return;
vis[x][y]=;
//printf("%d %d\n",x,y);
for (i=;i<;i++)
{
int sx=x+dx[i];
int sy=y+dy[i];
if (sx<||sx>=n||sy<||sy>=m) continue;
if (vis[sx][sy]) continue;
int q=yj[sx][sy]-'A';
int w=yj[x][y]-'A';
if (check(q,w,i))
dfs(sx,sy);
}
}
int main()
{
int i,j;
while (~scanf("%d %d",&n,&m))
{
if (n==-&&m==-) break;
for (i=;i<n;i++)
scanf("%s",yj[i]);
memset(vis,,sizeof(vis));
ans=;
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
if (vis[i][j]) continue;
dfs(i,j);
ans++;
}
}
printf("%d\n",ans);
}
return ;
}
hdu 1198 (并查集 or dfs) Farm Irrigation的更多相关文章
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- HDU 4496 并查集 逆向思维
给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...
- HDU 1232 并查集/dfs
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...
- hdu-1272 小希的迷宫---并查集或者DFS
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目大意: Problem Description 上次Gardon的迷宫城堡小希玩了很久(见 ...
- HDU 2860 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=2860 n个旅,k个兵,m条指令 AP 让战斗力为x的加入y旅 MG x旅y旅合并为x旅 GT 报告x旅的战斗力 ...
- POJ 1562 Oil Deposits (并查集 OR DFS求联通块)
Oil Deposits Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14628 Accepted: 7972 Des ...
- Is It A Tree?(并查集)(dfs也可以解决)
Is It A Tree? Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submi ...
- hdu 1598 (并查集加贪心) 速度与激情
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1598 一道带有贪心思想的并查集 所以说像二分,贪心这类基础的要掌握的很扎实才行. 用结构体数组储存公 ...
随机推荐
- C# 图像处理: 获取当前活动窗口句柄,获取窗口大小及位置
需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllImport( ...
- Illegal access: this web application instance has been stopped already. could not load **
启动tomcat的时候会报这样的错误: Illegal access: this web application instance has been stopped already. could n ...
- kafka 清除topic数据脚本
原 kafka 清除topic数据脚本 2018年07月25日 16:57:13 pete1223 阅读数:1028 #!/bin/sh param=$1 echo " ...
- python scrapy 插入数据库的操作
需要安装这个 pymysql 写法还是很简单的 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget t ...
- 2018面向对象程序设计(Java)第10周学习指导及要求
2018面向对象程序设计(Java)第10周学习指导及要求(2018.11.1-2018.11.4) 学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接口的定 ...
- VSC KeyNote
[VSC KeyNote] 1.前后跳转. Alt + LeftArrow, Alt + RightArrow 2.缩进问题. vsc默认缩进为4,但js代码里缩进依旧是2. 因为vscode默认启用 ...
- 无线渗透开启WPS功能的路由器
首先关闭网络服务 service network-manager stop wps一般可在10-20小时可以爆破开,攻击难度较低,有一些厂家的无线路由甚至无法关闭WPS功能. 开始侦听开启wps功能的 ...
- 【scrapy】爬虫中报Forbidden by robots.txt
需要在setting.py里找到ROBOTSTXT_OBEY并设为false 来源:https://blog.csdn.net/yimingsilence/article/details/521197 ...
- contextlib 上下文管理器
在Python中,读写文件这样的资源要特别注意,必须在使用完毕后正确关闭它们.正确关闭文件资源的一个方法是使用try...finally: try: f = open('/path/to/file', ...
- Oracle中dbms_random.string 的用法
转载:https://blog.csdn.net/simonchi/article/details/8657787 DBMS_RANDOM.STRING(var1,var2) 这个函数有两个参数 va ...