dreamxr
精诚所至,金石为开!

导航

 

分析

 利用dfs实现,特殊的是不同的点能搜索的范围是不一样的,只有下个点和当前点能够互相可达,才能去dfs下一个点,每次搜索时记录下能搜到的农田的个数。

#include<cstdio>
#include<map>
#include<cstring>
#define N 55
using namespace std;
char s[N][N];
bool v[N][N];
int cnt;
map<char,int>M;
int n,m;
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};// r,l,down,up
bool p[N][4];
int check(int i){
	switch(i){
		case 0:return 1;
		case 1:return 0;
		case 2:return 3;
		case 3:return 2;
	}
}
void init(){
	for(int i=0;i<11;i++)
		M[i+'A']=i;
	memset(p,1,sizeof(p));
	p[0][0]=p[0][2]=0;
	p[1][1]=p[1][2]=0;
	p[2][3]=p[2][0]=0;
	p[3][1]=p[3][3]=0;
	p[4][0]=p[4][1]=0;
	p[5][2]=p[5][3]=0;
	p[6][2]=p[7][0]=p[8][3]=p[9][1]=0;
}
void dfs(int x,int y){
	if(x<0||x>=n||y<0||y>=m)return;
	if(v[x][y])return;
	v[x][y]=1;
	++cnt;
	for(int i=0;i<4;i++){
		if(p[M[s[x][y]]][i]){
			int px=x+move[i][0];
			int py=y+move[i][1];
			if(p[M[s[px][py]]][check(i)])
			dfs(px,py);
		}
	}
	return;
}
int main(){
	init();
	while(~scanf("%d%d",&n,&m)){
		if(n<0&&m<0)
		return 0;
		memset(v,0,sizeof(v));
		for(int i=0;i<n;i++)
			scanf("%s",s[i]);
		int tot=n*m;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++){
				cnt=0;
				dfs(i,j);
				if(cnt) tot-=(cnt-1);
			}
		printf("%d\n",tot);
	}
	return 0;
}

  

posted on 2012-08-29 23:37  dreamxr  阅读(112)  评论(0)    收藏  举报