随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

 

迷阵由 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;
 }

 

posted on   towboat  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示