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 ...
随机推荐
- input实时监控和获取焦点的问题,oninput,ononfocus
1.input监控实时输入问题,google浏览器使用oninput,其他浏览器(IE6/7/8)使用onpropertychange var ie = !!window.ActiveXObject; ...
- 完善SQL农历转换函数
-------------------------------------------------------------------- -- Author : 原著: 改编:ht ...
- 网页细分图结果分析(Web Page Diagnostics)
Discuz开源论坛网页细分图结果分析(Web Page Diagnostics) 续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场 ...
- AndroidTips:解决Dialog全屏显示以及Dialog显示自动弹出输入法
继承实现一个dialog,并在onCreate里面做处理. @Override protected void onCreate(Bundle savedInstanceState) { s ...
- no-jquery 05 Utilities
Utilities type // is this a function? typeof someValue === 'function'; // is this an object? someVal ...
- json解析不推荐使用eval
推荐使用JSON.parse() 低版本浏览器(IE6/7)不支持此方法,可以通过网上下载json2.js,引入到文件中,此文件通过判断浏览器是否支持JSON.parse()方法,如果不支持,文件中编 ...
- JavaScrip实现3D旋转动态效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android客户端性能测试(一):使用APT测试Android应用性能
一.APT介绍: APT:Android Performance Testing Tools,适用于开发自测和定位性能瓶颈,帮助测试人员完成[性能基准测试.竞品测试]. APT提供了CPU利用率实时曲 ...
- POJ2711 Leapin' Lizards(最大流)
比较形象的是地图每个点都拆成三个点,这三个点限制流量为0或1,于是再一分为二,这样每个点都被拆成6个点... 其实拆两个点,连容量为柱子高的边,这样就行了.. 这题我掉坑了,“1 lizard was ...
- 使用递推解题:EOJ2999
题目: Description 给定一个多项式 (ax+by)k,计算多项式展开后 xnym 项的系数. Input 第1行:一个整数T(1≤T≤10)为问题数. 接下来共T行.每行5个整数,分别为a ...