题解 | #D 迷阵#

字符串修改

https://ac.nowcoder.com/acm/contest/11232/A

二分搜索答案。
代码里面有注释。

#include<bits/stdc++.h>
using namespace std;
int dir[4][2]= {{1, 0}, {0, 1}, {0, -1},{-1, 0}};
int n;
int vis[110][110], a[110][110];

// 防止越界、或者重复访问 
bool check(int x, int y){
    if(x < 1 || x > n){
        return false;
    }
    if(y < 1 || y > n){
        return false;
    }
    if(vis[x][y]){
        return false;
    }

    return true;
}

void dfs(int x, int y, int minn, int maxn){
    // 四个方向硬搜 
    for(int i = 0; i < 4; i++) {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];

        // 搜索的值都在minn 和 maxn之内 
        if(check(xx,yy) && a[xx][yy] >= minn && a[xx][yy] <= maxn) {
            vis[xx][yy] = 1;
            dfs(xx, yy, minn, maxn);
        }
    }
}



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, res = 3000;
    while(l <= r){
        int mid = (l + r) >> 1;
        int f = 0;
        // 遍历minn 和 maxn
        // maxn - minn = mid
        for(int i = 0; i < 3000 - mid; i++){
            if(a[1][1] < i || a[1][1] > i + mid)    continue;
            memset(vis, 0, sizeof(vis));
            vis[1][1] = 1;
            // 起始点, 最小值, 最大值 
            dfs(1, 1, i, i + mid);

            // 如果能够到达终点 
            if(vis[n][n]){
                f = 1;
                break;
            }
        }
        if(f){
            res = mid;
            r = mid - 1;
        }
        else{
            l = mid + 1;

        }
    }

    cout<<res;


    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:46
暑期就挂了,秋招还有机会吗
大聪明777:研发提前批,14号刚开的,官网上面的配图上有写。提前批没过的话,秋招还可以投,不过前面的笔试/面试记录会被保留,供秋招参考
26届校招投递进展
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务