ZOJ 2412 Farm Irrigation
题目描述:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1412
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=50; int r[4]= {0,-1,0,1},c[4]= {1,0,-1,0}; int A[3*maxn+10][3*maxn+10],ch[11][3][3]; int ind[maxn+10][maxn+10]; char s[maxn+10][maxn+10]; int m,n,ans; void init() { ch[0]= {{0,1,0},{1,1,0},{0,0,0}}; ch[1]= {{0,1,0},{0,1,1},{0,0,0}}; ch[2]= {{0,0,0},{1,1,0},{0,1,0}}; ch[3]= {{0,0,0},{0,1,1},{0,1,0}}; ch[4]= {{0,1,0},{0,1,0},{0,1,0}}; ch[5]= {{0,0,0},{1,1,1},{0,0,0}}; ch[6]= {{0,1,0},{1,1,1},{0,0,0}}; ch[7]= {{0,1,0},{1,1,0},{0,1,0}}; ch[8]= {{0,0,0},{1,1,1},{0,1,0}}; ch[9]= {{0,1,0},{0,1,1},{0,1,0}}; ch[10]= {{0,1,0},{1,1,1},{0,1,0}}; } bool charge(int x,int y) { if(x<0||y<0||x>=3*m||y>=3*n||A[x][y]==0) return false; return true; } void dfs(int x,int y) { A[x][y]=0; for(int i=0;i<4;i++) { int a=x+r[i]; int b=y+c[i]; if(charge(a,b)) dfs(a,b); } } int main() { // freopen("in.txt","r",stdin); init(); while(scanf("%d%d",&m,&n)&&m>0&&n>0) { ans=0; for(int i=0; i<m; i++) { scanf("%s",s[i]); } for(int i=0; i<m; i++) for(int j=0; j<n; j++) { ind[i][j]=int(s[i][j]-'A'); } for(int i=0; i<m; i++) for(int j=0; j<n; j++) { int tmp=ind[i][j]; for(int k=0; k<3; k++) for(int t=0; t<3; t++) { A[3*i+k][3*j+t]=ch[tmp][k][t]; } } for(int i=0;i<3*m;i++) for(int j=0;j<3*n;j++) { if(A[i][j]==1) { dfs(i,j); ans++; } } printf("%d\n",ans); } return 0; }