hdu Farm Irrigation
这题第一感觉是用搜索做,暴力就可以解决,这里将水管转换成一个个3*3的矩阵,然后搜素就可以了。写完之后确实一遍过掉了,31ms。附上代码:
#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"cmath"
#include"queue"
#include"stack"
#include"vector"
#include"string"
#include"string.h"
using namespace std;
const int mx=;
int A[][]={{,,},{,,},{,,}};
int B[][]={{,,},{,,},{,,}};
int C[][]={{,,},{,,},{,,}};
int D[][]={{,,},{,,},{,,}};
int E[][]={{,,},{,,},{,,}};
int F[][]={{,,},{,,},{,,}};
int G[][]={{,,},{,,},{,,}};
int H[][]={{,,},{,,},{,,}};
int I[][]={{,,},{,,},{,,}};
int J[][]={{,,},{,,},{,,}};
int K[][]={{,,},{,,},{,,}};
int dir[][]={{,},{,},{,-},{-,}};
int maze[mx][mx];
bool visited[mx][mx];
int m,n,wellspring;
bool judge(int x,int y)
{
if(x>=&&x<*m&&y>=&&y<*n&&maze[x][y]==&&!visited[x][y])
return true;
return false;
}
void dfs(int x,int y)
{
int dx,dy;
for(int i=;i<;i++)
{
dx=x+dir[i][];
dy=y+dir[i][];
if(judge(dx,dy))
{
visited[dx][dy]=true;
dfs(dx,dy);
}
}
}
void creat_maze(int a[][],int i,int j)
{
int p,q;
for(p=i*;p<i*+;p++)
{
for(q=j*;q<j*+;q++)
{
maze[p][q]=a[p-i*][q-j*];
}
}
}
void wellspring_count()
{
int i,j;
for(i=;i<*m;i++)
{
for(j=;j<*n;j++)
{
if(maze[i][j]==&&!visited[i][j])
{
wellspring++;
visited[i][j]=true;
dfs(i,j);
}
}
}
printf("%d\n",wellspring);
}
void input()
{
int i,j;
while(scanf("%d%d",&m,&n),m!=-||n!=-)
{
memset(visited,false,sizeof(visited));
wellspring=;
char pipe;
for(i=;i<m;i++)
{
getchar();
for(j=;j<n;j++)
{
scanf("%c",&pipe);
switch(pipe)
{
case 'A': creat_maze(A,i,j);break;
case 'B': creat_maze(B,i,j);break;
case 'C': creat_maze(C,i,j);break;
case 'D': creat_maze(D,i,j);break;
case 'E': creat_maze(E,i,j);break;
case 'F': creat_maze(F,i,j);break;
case 'G': creat_maze(G,i,j);break;
case 'H': creat_maze(H,i,j);break;
case 'I': creat_maze(I,i,j);break;
case 'J': creat_maze(J,i,j);break;
case 'K': creat_maze(K,i,j);break;
}
}
}
wellspring_count();
}
} int main()
{
// freopen("E:\\in.txt","r",stdin);
input();
return ;
}
但是这是一个并查集专题里的题,所以应该还会有更高效的方法,毕竟我的代码里没有用到并查集。
所以又想了一下,瞬变看了一下别人的并查集思路,又写了一个代码。然而,这次用并查集却死活过不了。。。找bug找了接近两个小时了,自己找的案例都过掉了。。。
先附上wa掉的代码:
#include"iostream"
#include"stdio.h"
#include"string"
#include"string.h"
#include"cmath"
#include"algorithm"
#include"ctype.h"
#include"queue"
#include"stack"
#include"vector"
using namespace std;
const int mx=;
int maze[mx][mx];
int fa[mx*mx];
int m,n,wellspring;
int dir[][]={{,-},{-,},{,},{,}};//左上右下
//左上右下有水管接口的用1表示
int farm[][]=
{
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,}
};
void Set()
{
int i;
for(i=;i<m*n;i++)
fa[i]=i;
} int Find(int x)
{
int t1,t2=x;
while(t2!=fa[t2]) t2=fa[t2];
return t2;
} void Union(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
fa[fx]=fy;
wellspring--;
}
} bool judge(int k,int x,int y)
{
switch(k)
{
case :
if(farm[x][]&&farm[y][])
return true;
break;
case :
if(farm[x][]&&farm[y][])
return true;
break;
case :
if(farm[x][]&&farm[y][])
return true;
break;
case :
if(farm[x][]&&farm[y][])
return true;
break;
}
return false;
} void Count()
{
int i,j,k,dx,dy;
for(i=;i<m;i++)
{
for(j=;j<n;j++)
{
for(k=;k<;k++)
{
dx=i+dir[k][];
dy=j+dir[k][];
if(dx>=&&dx<m&&dy>=&&dy<n)//判定越界条件
if(judge(k,maze[i][j],maze[dx][dy]))
Union(i*m+j,dx*m+dy);
}
}
}
} void Input()
{
int i,j;
while(scanf("%d%d",&m,&n),m>=&&n>=)
{
Set();
wellspring=m*n;
char pipe;
for(i=;i<m;i++)
{
getchar();
for(j=;j<n;j++)
{
scanf("%c",&pipe);
maze[i][j]=pipe-'A';
}
}
Count();
printf("%d\n",wellspring);
}
} int main()
{
// freopen("E:\\in.txt","r",stdin);
Input();
return ;
}
hdu Farm Irrigation的更多相关文章
- HDU 1198 Farm Irrigation(状态压缩+DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1198 Farm Irrigation(并查集+位运算)
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
- ZOJ 2412 Farm Irrigation
Farm Irrigation Time Limit: 2 Seconds Memory Limit: 65536 KB Benny has a spacious farm land to ...
- HDU1198水管并查集Farm Irrigation
Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot ...
- ZOJ 2412 Farm Irrigation(DFS 条件通讯块)
意甲冠军 两个农田管内可直接连接到壳体 他们将能够共享一个水源 有11种农田 管道的位置高于一定 一个农田矩阵 问至少须要多少水源 DFS的连通块问题 两个相邻农田的管道能够直接连接的 ...
- 【简单并查集】Farm Irrigation
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
随机推荐
- python最简单的http服务器
人生苦短,我用python 今天有个需求就是简单的把自己的图片通过web共享,自然就想起了使用服务器了,在python下使用一个简单的服务器是非常方便的,用到标准库里面的SimpleHTTPServe ...
- bzoj专题训练
//http://blog.csdn.net/PoPoQQQ/article/category/2542243
- js实现页面的自动读秒跳转
<!-- 代码片段A --> <!-- 倒计时跳转 --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Trans ...
- Liferay 6.2 改造系列之七:关闭使用条款确认、密码提醒、新用户强制修改密码等功能
关闭使用条款确认: 在/portal-master/portal-impl/src/portal.properties配置文件中,有如下配置: # # Set this to true if all ...
- 设置type为file的input标签选择图片类型
设置能选择各种类型的图片如:png,jpg <input id="file" name="file" type="file" acce ...
- Eclipse如何替换android应用图标
打开你的项目 我们看到项目里有 res这个文件夹里有以下文件夹. drawable-hdpi -------高分辨率 drawable-ldpi -------中分辨率 drawab ...
- POJ 1226 后缀数组
题目链接:http://poj.org/problem?id=1226 题意:给定n个字符串[只含大小写字母],求一个字符串要求在n个串或者他们翻转后的串的出现过.输出满足要求的字符串的长度 思路:根 ...
- ios开发学习笔记(这里一定有你想要的东西,全部免费)
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...
- hive streaming 使用shell脚本
一.HIVE streaming 在Hive中,需要实现Hive中的函数无法实现的功能时,就可以用Streaming来实现.其原理可以理解成:用HQL语句之外的语言,如Python.Shell来实现这 ...
- aapt命令介绍及常用命令实践
D:\>aapt -h ERROR: Unknown command '-h' Android Asset Packaging Tool Usage: aapt l[ist] [-v] [-a] ...