2019多校联讯 test 3 T2
dfs+二分答案,二分可能的伤害值
#include<bits/stdc++.h> using namespace std; const int maxn=1050; int n,m; int p[maxn][maxn]; int dx[5]={0,1,-1,0,0}; int dy[5]={0,0,0,-1,1}; int l,r; bool flag; bool vis[maxn][maxn]; void dfs(int x,int y,int cost) { if(x==n){ flag=true; return; } for(int i=1;i<=4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&cost>=p[xx][yy]) { vis[xx][yy]=true; dfs(xx,yy,cost); } if(flag==true) return; } } bool check(int x) { flag=false; memset(vis,0,sizeof(vis)); dfs(1,1,x); if(flag) return true; else return false; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&p[i][j]); } } l=0,r=1000; while(l<=r) { int mid=(l+r)/2; if(check(mid)) r=mid-1; else l=mid+1; } printf("%d",l); return 0; }