标签:普及 vis int mid dfs 牛客 迷阵 && 最小值
题目链接:点这里~
题目大意
n*n的矩阵,每个位置有属性wij,精神混乱时间是从(1,1)到(n,n)走过路径中属性的最大值-最小值,问精神混乱时间最小值是多少。
思路
二分。很暴力的二分。首先二分那个差值,然后暴力枚举其中的最小值i,那么路径中最大值也就是i+mid,从(1,1)开始走dfs,属性在最小值到最大值这个区间才能走,然后最后看看能不能走到(n,n)即可,这里既可以是bfs又可以是dfs。
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int inf = 0x3f3f3f3f;
#define ok(x, y) x>=1&&x<=n&&y>=1&&y<=n
int a[105][105], vis[105][105], n;
struct node{
int x, y, dist;
};
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
void dfs(int x, int y, int minn, int maxx){
vis[x][y] = 1; //标记点
for(int i = 0; i < 4; i ++){
int tx = dx[i] + x;
int ty = dy[i] + y;
if(ok(tx,ty)&&!vis[tx][ty]&&a[tx][ty] >= minn&&a[tx][ty] <=maxx){ //没越界并且属性在范围内
dfs(tx,ty,minn,maxx);
}
}
}
bool check(int x){
for(int i = 0; i + x <= 3000; i ++){
if(a[1][1] < i || a[1][1] > i + x) continue; //dfs中没有判断(1,1)那么就在外面判断
memset(vis, 0, sizeof(vis));
dfs(1, 1, i, i + x);
if(vis[n][n])return true;
}
return false;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) cin >> a[i][j];
int l = 0, r = 3000, ans = 0;
while(l <= r){
int mid = l + r >> 1;
if(check(mid)) r = mid - 1, ans = mid;
else l = mid + 1;
}
cout << ans << endl;
return 0;
}
标签:普及,vis,int,mid,dfs,牛客,迷阵,&&,最小值 来源: https://blog.csdn.net/weixin_43911947/article/details/116375452
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。