【P1902】刺杀大使-[二分答案+BFS]

本文介绍了解决寻找从矩阵第一行到最后一行的最大值最小路径问题的两种方法:一是利用二分答案结合BFS搜索算法,二是采用最小生成树算法。重点展示了二分答案+BFS的具体实现过程。

题目链接

https://www.luogu.com.cn/problem/P1902

在这里插入图片描述
在这里插入图片描述

解题思路

解法1:二分答案+BFS
1.求最大值的最小值对于出现这种要求的题目,应该首先考虑能否用二分答案进行求解,因为这是二分答案的典型用法。
2.分析题目意思:找出从第一行到第n行的一条路径,使得经过的点的最大值最小;
3.这样我们就可以把二分答案的mid值作为BFS的一个条件,判断是否到达第n行;如果可以,说明此时mid值>=ans,往左边([l,mid])搜索,否则搜索[mid+1,r];
代码展示

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
/*
找一条最大值最小的路径(第1行~第n行)
二分答案+BFS
*/
int G[1005][1005];
int n,m;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool BFS(int maxnum){
	//判断最大值为maxnum的情况能否通过
	queue<pair<int,int> >q;
	q.push(make_pair(1,1));
	bool vis[1005][1005];
	memset(vis,0,sizeof(vis));
	vis[1][1]=1;
	while(!q.empty()){
		pair<int,int> temp=q.front();
		q.pop();
		int x=temp.first;
		int y=temp.second;
		if(x==n)return true;
		for(int i=0;i<4;i++){
			int fx=x+dx[i];
			int fy=y+dy[i];
			if(fx<1||fx>n||fy<1||fy>m||G[fx][fy]>maxnum)continue;
			if(!vis[fx][fy]){
				vis[fx][fy]=1;
				q.push(make_pair(fx,fy));
			}
		}
	}
	return false;
}
int main(){
	cin>>n>>m;
	int l=1000,r=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>G[i][j];
			if(i!=1&&i!=n){
				l=min(G[i][j],l);
				r=max(G[i][j],r);
			}
			
		}	
	} 
	int ans;
	while(l<r){
		int mid= (l+r) >> 1;
		if(BFS(mid)){ 
			r=mid,ans=mid;
		}
		else {
			l=mid+1;
		}
	}
	cout<<l<<endl;
	return 0;
}

解法2:最小生成树

总结

1.二分答案的边界没有固定的模板,需要我们自己判断;我喜欢对样例手打一遍来判断边界是否正确。

在Vlog -94环境下使用`+cover = bfs`来获取FPGA覆盖率,以下是一些相关的方法和知识。 ### 基本概念 `+cover = bfs` 是一种用于开启特定覆盖率收集模式的编译选项。其中,`bfs` 可能代表某种特定的覆盖率收集策略,通常用于收集功能覆盖率。功能覆盖率用于衡量设计的功能是否被测试用例充分覆盖,它关注的是设计的行为和功能点。 ### 具体步骤 #### 1. 编写覆盖率模型 在Verilog代码中,需要定义覆盖率点。覆盖率点可以是状态机的状态、信号的特定值组合等。例如,下面是一个简单的状态机覆盖率模型示例: ```verilog module simple_fsm; reg [1:0] state; parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11; // 覆盖率组定义 covergroup fsm_state_cg; // 覆盖率点 state_point: coverpoint state { bins s0_bin = {S0}; bins s1_bin = {S1}; bins s2_bin = {S2}; bins s3_bin = {S3}; } endgroup initial begin fsm_state_cg cg = new(); // 状态机模拟 state = S0; #10 state = S1; #10 state = S2; #10 state = S3; end endmodule ``` #### 2. 编译和仿真 在编译和仿真时,使用`+cover = bfs`选项来开启覆盖率收集。假设使用ModelSim进行仿真,编译和仿真命令如下: ```bash # 编译Verilog代码 vlog +cover = bfs simple_fsm.v # 启动仿真 vsim -coverage work.simple_fsm # 运行仿真 run -all # 生成覆盖率报告 coverage report -file coverage_report.txt ``` #### 3. 分析覆盖率报告 仿真结束后,会生成覆盖率报告。报告中会显示各个覆盖率点的覆盖情况,例如哪些状态被覆盖了,哪些状态没有被覆盖。通过分析报告,可以找出测试用例的不足之处,进而补充测试用例以提高覆盖率。 ### 注意事项 - **覆盖率模型的完整性**:确保覆盖率模型涵盖了设计的所有重要功能点。如果覆盖率模型不完整,即使测试用例执行得很充分,也可能无法准确反映设计的覆盖情况。 - **仿真工具的支持**:不同的仿真工具对`+cover = bfs`选项的支持可能有所不同,需要查阅相应工具的文档以确保正确使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值