D.小L的扩展

小L的扩展

https://ac.nowcoder.com/acm/contest/120566/D

题意: 有n×m的矩阵,有a个格子是染黑的,并在每个单位时间往外四个方向扩散。有b个格子是蓝墨水,他会在时间刻变白,在变白之前他不会被染黑,求整个矩阵全部染黑的时间。(蓝墨水变白的判定在染黑判定之前,换句话说如果蓝墨水旁边有个染黑的格子,假设蓝墨水到第5s变白,那他会被旁边的染黑格子在第5s染黑。)

知识点: BFS,图论

思路: 把每个染黑的格子放入优先队列里边BFS,并初始化染黑的格子为0,接着每次BFS都等于前一个格子+1,来模拟他的时间,当遇到蓝色墨水时,则等于max(下一秒,蓝墨水变白的时刻),然后用一个maxn变量,在每次格子数值改变时记录下最大的时间就可以了。(不会BFS和优先队列的建议去看看基础BFS题目和优先队列题目,然后再来做这题。)

同时优先队列我还是选用的三元组,设置第一个元素为达到当前格子的时间,来实现时间早的先BFS,这样可以避免出现普通BFS时遇到一坨蓝色的,然后我BFS找到这个蓝色之后,把他设置成max(下一秒,蓝墨水变白的时刻),然后直接BFS到下一个蓝色方块,直接继承上一个蓝色方块+1,但是有其他黑色方块直接染到这个方块时间更少,举个例子。

设黑色为0,白色为-1,蓝色为变成白色的时刻t

 +0 -1 -1
-1  7  -1
-1  3 -1  
普通BFS第一轮(按照上右下左的顺序)
+0  1 -1
 1  7 -1
-1  3 -1  
第二轮
+0  1  2
 1  7  3
 2  8 -1  //就出现问题了
 
 而在优先对列下加入了时间排序,7会直接排到最后,就会先等2,3那些先BFS完了最后到他

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define endl '\n'
using namespace std;
const int m=998244353;
const int mod=1e9+7;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool judg(int nex,int ney,int n,int m)
{
	return (nex>=0&&nex<n&&ney>=0&&ney<m);
}
int main()
{
	cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
	int n,m,a,b,maxn=-1;
	cin >> n >> m >> a >> b;
	vector<vector<int>> mp(n,vector<int>(m,-1));
	vector<vector<bool>> v(n,vector<bool>(m,0));
	priority_queue<pair<int,PII>,vector<pair<int,PII>>,greater<pair<int,PII>>> pq;
	for(int i=0;i<a;i++){
		int x,y;
		cin >> x >> y;
		x--,y--;
		mp[x][y]=0;
		pq.push({mp[x][y],{x,y}});
		v[x][y]=1;
	}
	for(int i=0;i<b;i++){
		int x,y,t;
		cin >> x >> y >> t;
		x--,y--;
		mp[x][y]=t;
	}
	while(!pq.empty()){
		PII top=pq.top().second;
		int t=pq.top().first;
		pq.pop();
		for(int i=0;i<4;i++){
			int nex=top.first+dx[i],ney=top.second+dy[i];
			if(judg(nex,ney,n,m)&&!v[nex][ney]){
				if(mp[nex][ney]==-1){
					mp[nex][ney]=t+1;
					pq.push({mp[nex][ney],{nex,ney}});
				}
				else{
					mp[nex][ney]=max(t+1,mp[nex][ney]);
					pq.push({mp[nex][ney],{nex,ney}});
				}
				v[nex][ney]=1;
				maxn=max(mp[nex][ney],maxn);
			}
		}
	}
	cout << maxn;
	return 0;
}
全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
双非后端失败第N人:1. go语言我建议你让ai带着你先把基本语法速通了,然后再去用go重新刷你以前刷过的leetcode,这样熟悉起来很快 2. 直接看你们组go项目,里面用***比较复杂,然后把每一个语法现象都喂给ai,一点点看
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务