迷阵由 n×m 个相同的小房间组成,每个房间与相邻四个房间之间有门可通行。在第 n 行的 m 个房间里有 m个机关,
这些机关必须全部打开。而第 1 行的 mm个房间有 mm 扇向外打开的门,是迷阵的入口。
除了第 11行和第 nn 行的房间外,每个房间都被使馆的安保人员安装了激光杀伤装置,将会对进入房间的人造成一定的伤害。
第 ii 行第 jj 列 造成的伤害值为a[i][j]
现在某组织打算以最小伤害代价进入迷阵,打开全部机关,显然,他们可以选 择任意多的人从任意的门进入,但必须到达第 nn 行的每个房间。
一个士兵受到的伤害值为他到达某个机关的路径上所有房间的伤害值中的最大值,整个部队受到的伤害值为所有士兵的伤害值中的最大值。
求整个部队的伤害值最小。
#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; }