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;
} 
posted @ 2018-12-05 16:36  ChunhaoMo  阅读(142)  评论(0编辑  收藏  举报