二进制-深搜问题

城堡问题http://ybt.ssoier.cn:8088/problem_show.php?pid=1250

二进制-深搜问题_第1张图片

对于这类问题,应注意一些细节,比如边界问题,还有m,n,i,j等字母的处理问题

#include 
#include
using namespace std;

const int N=55;
int m,n;
int pi[N][N];
bool flag[N][N];
int num=0;

void baosou(int x,int y){
	if(flag[x][y]) return ;
	if(x<1||y<1||x>m||y>n) return ;
	
	num++;
	flag[x][y]=true;
	if((pi[x][y]&1)==0) baosou(x,y-1);//一定要判断 (pi[x][y]&1)==0,才能确保这个方向是没墙的 
	if((pi[x][y]&2)==0) baosou(x-1,y);
	if((pi[x][y]&4)==0) baosou(x,y+1);
	if((pi[x][y]&8)==0) baosou(x+1,y); 
}

int main(){
	int sum=0,max1=0;
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){//注意从1开始,结束标志要<=m或<=n,这些细节要处理好 
			cin>>pi[i][j];
			flag[i][j]=false;//处理边界问题 
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){//还有这里,循环条件控制的细节也要处理好 
			if(!flag[i][j]){
				num=0;
				baosou(i,j);
				max1=max(max1,num);
				sum++;
			}
			
		}
	}
	cout<

 

你可能感兴趣的:(蓝桥杯,c++)