第十二届模拟赛,bfs广度优先搜索

题目描述 小蓝负责花园的灌溉工作。 花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。


小蓝负责花园的灌溉工作。
花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。)
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 k k k 分钟后,有多少个方格被灌溉好?
输入格式
输入的第一行包含两个整数 n n n, m m m。
第二行包含一个整数 t t t,表示出水管的数量。
接下来 t t t 行描述出水管的位置,其中第 i i i 行包含两个数 r , c r, c r,c 表示第 r r r 行第 c c c 列有一个排水管。
接下来一行包含一个整数 k k k。
输出格式
输出一个整数,表示答案。
样例输入

3 6
2
2 2
3 4
1

样例输出

9

样例说明
用1表示灌溉到,0表示未灌溉到。
打开水管时:
  000000
  010000
  000100
1分钟后:
  010000
  111100
  011110
  共有9个方格被灌溉好。
数据规模和约定  
对于所有评测用例: 1 ≤ n , m ≤ 100 , 1 ≤ t ≤ 10 , 1 ≤ k ≤ 100 1 \leq n, m \leq 100, 1 \leq t \leq 10, 1 \leq k \leq 100 1≤n,m≤100,1≤t≤10,1≤k≤100。
将最初水龙头的位置标记,存入队列,再用一个队列存储下一分钟蔓延的位置,每分钟结束,更新队列中的元素,最后输出在规定时间内灌溉的位置有多少个即可。

题目描述 小蓝有一张黑白图像,由 n ∗ m n * m n∗m 个像素组成,其中从上到下共 n n n 行,每行从左到右 m m m 列。每个像素由一个 0 到 255 之间的灰度值表示。


小蓝有一张黑白图像,由 n ∗ m n * m n∗m 个像素组成,其中从上到下共 n n n 行,每行从左到右 m m m 列。每个像素由一个 0 到 255 之间的灰度值表示。)
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心 3 * 3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入格式
输入的第一行包含两个整数 n , m n, m n,m。
第 2 行到第 n + 1 n + 1 n+1 行每行包含 m m m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
输出格式
输出 n n n 行,每行 m m m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。
样例输入

3 4
0 0 0 255
0 0 255 0
0 30 255 255

样例输出

0 42 85 127
5 60 116 170
7 90 132 191

数据规模和约定
对于所有评测用例, 1 ≤ n , m ≤ 100 1 \leq n, m \leq 100 1≤n,m≤100。

扩展有8个方向(点)扩展,然后以当前这个点为中心向 8 个方向扩展即可,最后按照题意求模糊值。

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
int vis[110][110];
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1} ;//8个点 
int mp[110][110];
int ans[110][110];
bool inbound(int x, int l, int r)
{ if(x < l || x > r) return false;//不在范围里
 return true;
}

int main()
{ int n,m; cin>>n>>m;
 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++)
 
  { int t = mp[i][j], cnt = 1; 
  
  for(int k = 0; k <8; k++) 
  {    int tx = i + dir[k][0];
       int ty = j + dir[k][1]; 
   if(!inbound(tx,1,n) || !inbound(ty,1,m)) 
   continue; 
   t += mp[tx][ty]; 
   cnt++; 
   } 
   ans[i][j] = (int)(t/cnt); 
   } 
   }
   
    for(int i = 1; i <= n; i++) 
	{ for(int j = 1; j <= m; j++)
	 if(j == 1) cout<<ans[i][j]; 
	 else cout<<" "<<ans[i][j]; cout<<'\n'; } 
	 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值