城堡问题http://ybt.ssoier.cn:8088/problem_show.php?pid=1250
对于这类问题,应注意一些细节,比如边界问题,还有m,n,i,j等字母的处理问题
#include<iostream>
#include<algorithm>
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<<sum<<endl;
cout<<max1<<endl;
return 0;
}
?
|