Leecode934.最短的桥

最短的桥

在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)

现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。

返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)

输入:[[0,1],[1,0]]
输出:1
输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2

这题的思路是什么呢?
给你两座岛,那么你最应该先区别开两座岛,这里岛都是用1来表示,那我我其中一座岛一定得跟另一座岛区分开来,这样对后面无论怎样都有好处,用深搜找出第一座岛,把它标为2,接下来求最短路径那么就用BFS,从第二座岛出发,一层一层的查找,当最先到达第一座岛时,就是最短路径。


class Solution{
public:
    int x[4]={-1,1,0,0};
    int y[4]={0,0,1,-1};
    int shortestBridge(vector<vector<int>>& A){
        queue<pair<int,int>> q;
        bool is_print = false;//标识条件,只找一次,找第一座岛
        int row = A.size();
        int column = A[0].size();
        for(int i = 0; i < row; i++){
            for (int j = 0; j < column; j++){
                if (A[i][j] == 1 && !is_print){
                    dfs(A,i,j);
                    is_print = true;
                }
                if(A[i][j] == 1){
                    q.push({i,j});
                    A[i][j] = -1;//如果可以的话找过之后值都给它修改一下,标识已经走过,防止陷入死循环;
                }
            }
        }

        int minpath = 0;
        while(!q.empty()){//广搜模板
            int size = q.size();
            for (int i = 0; i < size; i++){
                auto p = q.front();
                q.pop();
                int r = p.first;
                int c = p.second;
                for (int j = 0; j < 4; j++){
                    int dx = r + x[j];
                    int dy = c + y[j];
                    if (dx >= 0 && dy >= 0 && dx < row && dy < column){
                        if (A[dx][dy] == 2){
                            return minpath;
                        }
                        else if (A[dx][dy] == 0){
                            q.push({dx,dy});
                            A[dx][dy] = -1;
                        }
                    }
                }
            }
            ++minpath;
        }
        return minpath;
    }
    void dfs(vector<vector<int>>& A, int r, int c){
        A[r][c] = 2;
        int row = A.size();
        int column = A[0].size();
        for (int i = 0; i < 4; i++){
                int dx = r + x[i];
                int dy = c + y[i];
                if (dx >= 0 && dy >= 0 && dx < row && dy < column && A[dx][dy] == 1)
                dfs (A,dx,dy);
        }//深搜模板
    }
};

之前答案一直出错,找了半天也没发现哪有问题,后面才知道原来是dx>=0,这些没有考虑等于0的情况。注意边界,注意边界,注意边界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值