迷阵由 n×m 个相同的小房间组成,每个房间与相邻四个房间之间有门可通行。在第 n 行的 m 个房间里有 m个机关,
这些机关必须全部打开。而第 1 行的 mm个房间有 mm 扇向外打开的门,是迷阵的入口。
除了第 11行和第 nn 行的房间外,每个房间都被使馆的安保人员安装了激光杀伤装置,将会对进入房间的人造成一定的伤害。
第 ii 行第 jj 列 造成的伤害值为a[i][j]
现在某组织打算以最小伤害代价进入迷阵,打开全部机关,显然,他们可以选 择任意多的人从任意的门进入,但必须到达第 nn 行的每个房间。
一个士兵受到的伤害值为他到达某个机关的路径上所有房间的伤害值中的最大值,整个部队受到的伤害值为所有士兵的伤害值中的最大值。
求整个部队的伤害值最小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> #include <queue> #include <algorithm> using namespace std ; #define N 1003 #define PII pair<int,int> #define mk(x,y) make_pair(x,y) int n,m,a[N][N],vis[N][N]; int D[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool chk( int md){ queue<PII> q; q.push(mk(1,1)); int i,x,y; for (i=1;i<=n;i++) for ( int j=1;j<=m;j++) vis[i][j]=0; vis[1][1]=1; while (q.size()){ x=q.front().first,y=q.front().second; q.pop(); for (i=0;i<4;i++){ int xx=x+D[i][0],yy=y+D[i][1]; if (vis[xx][yy]) continue ; if (xx<=0||yy<=0||x>n||y>m||a[xx][yy]>md) continue ; vis[xx][yy]=1; q.push(mk(xx,yy)); if (xx==n) return 1; } } return 0; } signed main(){ int i,j,l=0,r=0; cin>>n>>m; for (i=1;i<=n;i++) for (j=1;j<=m;j++) cin>>a[i][j],r=max(a[i][j],r); int ans=0; while (l<=r){ int md=(l+r)/2; if (chk(md)) ans=md,r=md-1; else l=md+1; } cout<<ans<<endl; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!