题解:B4297 [蓝桥杯青少年组国赛 2022] 翻卡片
思路
看到题,首先就能想到搜索,看数据范围应该能过,就一遍过了。
输入后遍历矩阵,如果遇到 B
就把它当作 A
搜联通块,每次搜索记录最大答案,记得每次要先清空标记数组。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int n;
char a[N][N];
int px[4]={1,-1,0,0},py[4]={0,0,1,-1};
bool vis[N][N];
int ans;
void bfs(int x,int y){
memset(vis,0,sizeof(vis));
queue<pair<int,int>> q;
q.push({x,y});
int res=0;
vis[x][y]=1;
while(!q.empty()){
res++;
int nx=q.front().first,ny=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int ux=nx+px[i],uy=ny+py[i];
if(ux<1||ux>n||uy<1||uy>n||vis[ux][uy]||a[ux][uy]=='B') continue;
vis[ux][uy]=1;
q.push({ux,uy});
}
}
ans=max(ans,res);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='B') bfs(i,j);
}
}
cout<<ans;
return 0;
}