【题目链接】
【解题思路】
一道bfs很简单的一道题,我们只要想明白一个点,我们如果当前位置是一辆车的话,那么我们的攻击力就只有一行一列,再讲遇到的没有重复的车放入队列,最后我们再将有多少个联通块统计出来即可。
【CODE】
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int v[25][25];
int fx[15]={0,0,1,0,-1};
int fy[15]={0,1,0,-1,0};
char a[25][25];
struct note
{
int x,y;
};
queue<note > q;
bool check(int xxx,int yyy)
{
return xxx>0&&xxx<=n&&yyy>0&&yyy<=m;
}
void bfs(int xx,int yy)
{
note now;
now.x=xx;
now.y=yy;
q.push(now);
while (!q.empty())
{
note now=q.front();
q.pop();
note nowtt;
nowtt=now;
while (check(nowtt.x,nowtt.y))//一行一列扩展
{
nowtt.x=nowtt.x+1;
if (a[nowtt.x][nowtt.y]=='R'&&!v[nowtt.x][nowtt.y])//如果是车放入队列
{
q.push(nowtt);
v[nowtt.x][nowtt.y]=1;
}
}
nowtt=now;
while (check(nowtt.x,nowtt.y))
{
nowtt.x=nowtt.x-1;
if (a[nowtt.x][nowtt.y]=='R'&&!v[nowtt.x][nowtt.y])
{
q.push(nowtt);
v[nowtt.x][nowtt.y]=1;
}
}
nowtt=now;
while (check(nowtt.x,nowtt.y))
{
nowtt.y=nowtt.y+1;
if (a[nowtt.x][nowtt.y]=='R'&&!v[nowtt.x][nowtt.y])
{
q.push(nowtt);
v[nowtt.x][nowtt.y]=1;
}
}
nowtt=now;
while (check(nowtt.x,nowtt.y))
{
nowtt.y=nowtt.y-1;
if (a[nowtt.x][nowtt.y]=='R'&&!v[nowtt.x][nowtt.y])
{
q.push(nowtt);
v[nowtt.x][nowtt.y]=1;
}
}
}
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin>>a[i][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (!v[i][j]&&a[i][j]=='R')//当前必须是车才能扩展
{
bfs(i,j);
s++;//统计连通块的个数
}
}
cout<<s;
return 0;
}