Farm Irrigation
链接
[http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1412]
题意
Sample Input
2 2
DK
HF
3 3
ADC
FJK
IHE
-1 -1
Sample Output
2
3
分析
用二进制表示每个字母,位运算&既可以判断了
上有管1000,右有管0100,下有管0010,左有管0001,就加起来
if(mp[i][j]'A') b[i][j]=9;
else if(mp[i][j]'B') b[i][j]=12;
else if(mp[i][j]'C') b[i][j]=3;
else if(mp[i][j]'D') b[i][j]=6;
else if(mp[i][j]'E') b[i][j]=10;
else if(mp[i][j]'F') b[i][j]=5;
else if(mp[i][j]'G') b[i][j]=13;
else if(mp[i][j]'H') b[i][j]=11;
else if(mp[i][j]'I') b[i][j]=7;
else if(mp[i][j]'J') b[i][j]=14;
else b[i][j]=15;
具体看代码就知道了
代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N=110;
char mp[N][N];
int b[N][N];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//上下左右
int a[4]={2,8,4,1};//下上右左
int c[4]={8,2,1,4};//上下左右
int n,m;
void dfs(int x,int y){
int h=b[x][y];
b[x][y]=0;
for(int i=0;i<4;i++){
int x2=x+d[i][0],y2=y+d[i][1];
if(x2<0||x2>=n||y2<0||y2>=m||b[x2][y2]==0) continue;
if((b[x2][y2]&a[i])==a[i]&&(h&c[i])==c[i]) //相对能接的情况
dfs(x2,y2);
}
}
int main(){
//freopen("in.txt","r",stdin);
while(cin>>n>>m){
if(m==-1&&n==-1) break;
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(mp[i][j]=='A') b[i][j]=9;
else if(mp[i][j]=='B') b[i][j]=12;
else if(mp[i][j]=='C') b[i][j]=3;
else if(mp[i][j]=='D') b[i][j]=6;
else if(mp[i][j]=='E') b[i][j]=10;
else if(mp[i][j]=='F') b[i][j]=5;
else if(mp[i][j]=='G') b[i][j]=13;
else if(mp[i][j]=='H') b[i][j]=11;
else if(mp[i][j]=='I') b[i][j]=7;
else if(mp[i][j]=='J') b[i][j]=14;
else b[i][j]=15;
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(b[i][j]!=0){
dfs(i,j); sum++;
}
}
cout<<sum<<endl;
}
return 0;
}