L国的战斗之伞兵
题目背景
L国即将与I国发动战争!!
题目描述
为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区……(可怜的小兵)
输入格式
第一行:n、m两个正整数,表示敌国的大小。
以下n行,每行m个字符,“u”表示风向北吹;“d”表示风向南吹;“l”表示风向西吹;“r”表示风向东吹;“o”表示无风。(上北下南,左西右东)
输出格式
一个数:表示有几个点可以放下伞兵。
样例 1
样例输入 1
5 5
rrrrr
rdddr
rroll
uuuuu
uuuuu
样例输出 1
19
有一点类似于 “洛谷” 中的 “入门” 。方法都是从某一个点向周围未被标记的点扩散,最后统计被标记点的个数。
但是有两个地方不同:
1.起点的个数不再是1,可能是1,但也可能是其他值;
2.判断某一点是否可以到达当前点的时候,还需要考虑该点的风向是否正确。
方法依旧是广度优先搜索(BFS)。遍历o_num数组,从每一个无风区(即'o'点)出发,向周围区域扩散,并且打上标记。最后统计标记的个数。
代码实现:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char ch[1010][1010];
bool book[1010][1010];
int ans=0;
struct node
{
int x,y;
};
node o_num[1000000];
int main()
{
int n,m;
cin>>n>>m;
int k=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>ch[i][j];
if(ch[i][j]=='o')
{
node temp;
temp.x=i;
temp.y=j;
o_num[k]=temp;
k++;
}
}
for(int i=0;i<k;i++)
{
node temp=o_num[i];
queue<node> q;
q.push(temp);
ans++;
while(!q.empty())
{
node current=q.front();
q.pop();
node left,right,up,down;
left.x=current.x-1;
left.y=current.y;
right.x=current.x+1;
right.y=current.y;
up.x=current.x;
up.y=current.y-1;
down.x=current.x;
down.y=current.y+1;
if(left.x>=1&&ch[left.x][left.y]=='d'&&!book[left.x][left.y])
{
book[left.x][left.y]=true;
q.push(left);
ans++;
}
if(right.x<=n&&ch[right.x][right.y]=='u'&&!book[right.x][right.y])
{
book[right.x][right.y]=true;
q.push(right);
ans++;
}
if(up.y>=1&&ch[up.x][up.y]=='r'&&!book[up.x][up.y])
{
book[up.x][up.y]=true;
q.push(up);
ans++;
}
if(down.y<=m&&ch[down.x][down.y]=='l'&&!book[down.x][down.y])
{
book[down.x][down.y]=true;
q.push(down);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}