转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------


2 2 DK HF 3 3 ADC FJK IHE -1 -1
2 3
题意:有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇水,问需要打多少口井。
代码一(dfs):
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define TM 117
//存储11中类型的土地,二维中的0 1 2 3分别代表这种类型的土地的左上右下
//为1表示这个方向有接口,为0表示这个方向没有接口
int a[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},
{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
int map[TM][TM];
char s[TM][TM];
bool vis[TM][TM];
int n, m, coun;
void dfs(int x, int y)
{
vis[x][y] = true;
for(int i = 0; i < 4; i++)
{
if(i == 0)
{
if(a[map[x][y]][0]&&a[map[x-1][y]][2]&&x-1>=0&&!vis[x-1][y])
dfs(x-1,y);
}
else if(i == 1)
{
if(a[map[x][y]][1]&&a[map[x][y+1]][3]&&y+1<m&&!vis[x][y+1])
dfs(x,y+1);
}
else if(i == 2)
{
if(a[map[x][y]][2]&&a[map[x+1][y]][0]&&x+1<n&&!vis[x+1][y])
dfs(x+1,y);
}
else if(i == 3)
{
if(a[map[x][y]][3]&&a[map[x][y-1]][1]&&y-1>=0&&!vis[x][y-1])
dfs(x,y-1);
}
}
return;
}
void init()
{
memset(vis,false,sizeof(vis));
coun = 0;
}
int main()
{
int i, j;
while(cin>>n>>m)
{
init();
if(n==-1 && m==-1)
break;
for(i = 0; i < n; i++)
{
cin>>s[i];
for(j = 0; j < m; j++)
{
map[i][j] = s[i][j]-'A';
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(!vis[i][j])
{
coun++;
dfs(i,j);
}
}
}
cout<<coun<<endl;
}
return 0;
}待更新…………
hdu 1198 Farm Irrigation(深搜dfs || 并查集),布布扣,bubuko.com
hdu 1198 Farm Irrigation(深搜dfs || 并查集)
原文地址:http://blog.csdn.net/u012860063/article/details/37902749