

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; }
本文介绍了一种结合深度优先搜索(DFS)和二分查找算法解决迷宫问题的方法。通过设定可能的伤害值范围,利用二分查找优化搜索过程,最终找到从起点到终点的可行路径所需的最小伤害值。文章详细展示了算法实现过程,并提供了完整的代码示例。
513

被折叠的 条评论
为什么被折叠?



