标签:


2 2 DK HF 3 3 ADC FJK IHE -1 -1
2 3
题意:告诉几个田,如果有管道联通则可以灌溉,问最少需要几个灌溉器
分析,主要就是求联通块,一个联通块一个灌溉器,直接求需要几个联通块就可以了。
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
char s[1009][1009];
int vis[1009][1009];
int m,n;
int dis[4][2]={0,1,0,-1,1,0,-1,0};//右左下上
int up[]={1,1,0,0,1,0,1,1,0,1,1};
int dw[]={0,0,1,1,1,0,0,1,1,1,1};
int le[]={1,0,1,0,0,1,1,1,1,0,1};
int ri[]={0,1,0,1,0,1,1,0,1,1,1};
void dfs(int x,int y)
{
if(vis[x][y]) return;
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+dis[i][0];
int yy=y+dis[i][1];
if(xx<0 || xx>=m || yy<0 || yy>=n)continue;
if(i==0 && ri[s[x][y]-'A'] && le[s[xx][yy]-'A']) dfs(xx,yy);
if(i==1 && le[s[x][y]-'A'] && ri[s[xx][yy]-'A']) dfs(xx,yy);
if(i==2 && dw[s[x][y]-'A'] && up[s[xx][yy]-'A']) dfs(xx,yy);
if(i==3 && up[s[x][y]-'A'] && dw[s[xx][yy]-'A']) dfs(xx,yy);
}
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
if(n<0 || m<0 )break;
memset(vis,0,sizeof vis);
for(int i=0;i<m;i++)
scanf("%s",s[i]);
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(vis[i][j]==0)
{
ans++;
dfs(i,j);
}
printf("%d\n",ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/47984339