正经题解
2026-08-30 21:04:07
发布于:江苏
1阅读
0回复
0点赞
思路(我的):可以把总统桌四周不等于“.”的点加入到队列中,对每个点进行深搜(连通块)
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
char boss;
struct node{
int x,y;
};
char mp[110][110];
bool vis[110][110];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
queue <node> q;
int cnt=0;//计数
void dfs(int x,int y,char c){//c:上一个点的字符
vis[x][y]=true;//将此点标记
for(int i=0;i<4;i++){//遍历四周
int nx=x+dx[i];
int ny=y+dy[i];
if(mp[nx][ny]!=c)continue;//如果该点不等于上一张桌子的字符
if(vis[nx][ny])continue;//是否已经标记
if(nx<1||nx>n||nx<1||ny>m)continue;//出界
dfs(nx,ny,c);
}
}
int main(){
cin>>n>>m>>boss;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]==boss){//如果该桌是总统桌
for(int o=0;o<=3;o++){//搜索四周(只能将不是总统桌的桌子加入队列)
int nx=i+dx[o];
int ny=j+dy[o];
if(nx<1||nx>n||ny<1||ny>m)continue;//出界
if(mp[nx][ny]==boss)continue;//如果搜索到的点是总统桌不能将其加入队列
if(mp[nx][ny]=='.')continue;//判断是否不是桌子
q.push({nx,ny});
}
}
}
}
while(q.size()){
node t=q.front();
q.pop();
if(vis[t.x][t.y])continue;//该桌已经在之前被标记(属于其他桌子),跳过
dfs(t.x,t.y,mp[t.x][t.y]);
cnt++;//累加
}
cout<<cnt;
return 0;
}
这里空空如也



有帮助,赞一个