洛谷 P1913 L国的战斗之伞兵

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值