LintCode 199·判断连接 宽度优先搜索详解 C++/C

给定整数矩阵arr以及整数k,确定是否arr中值为k的所有单元是否都连接在一起。 如果矩阵中的两个单元在水平或垂直方向上相邻且具有相同的值,则视为连接。

输入:arr=[
[2,2,2,0],
[0,0,0,2],
[0,1,0,2],
[1,1,1,2]]
k=2
输出:false
解释:不是所有的2都相互连接

算法分析:这个题目我一开始的思路很直接,找到第一个k值,把他改为k+1,然后遍历他与他相连的所有k值,将其改为k+1。再遍历一遍数组,如果数组中还有k值的话,那就证明原数组中的k不是连通的,反之就是连通的。
当然还有另一种思路,使用bfs找出一块k值之后记录数量为1,继续查找数组剩下的元素,如果又查到一块的话则返回false。

这两种思路超过的提交数都蛮低的,但这是我能想到的最优的方法了,如果有更快的方法,希望可以指点一下。

class Solution {
public:
    /**
     * @param arr: the arr
     * @param k: the k
     * @return: if all instances of value k in arr are connected
     */

	//上下左右
    int v[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
    void BPS(vector<vector<int>> &arr,int i,int j,int k,int m,int n)
    {
        if(i>=0&&i<m&&j>=0&&j<n&&arr[i][j]==k)
        {
        	//改值
            arr[i][j]=k+1;
            //遍历上下左右
            for(int x=0;x<4;x++)
            {
                BPS(arr,i+v[x][0],j+v[x][1],k,m,n);
            }
        }
    }
    bool judgeConnection(vector<vector<int>> &arr, int k) {
        // Write your code here.

        int m=arr.size();
        int n=arr[0].size();

        int firsti,firstj;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(arr[i][j]==k)
                {
                	//一旦找到第一个k出现的地址,立即停止循环
                    firsti=i,firstj=j;
                    i=m,j=n;
                }
            }
        }

        BPS(arr,firsti,firstj,k,m,n);
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(arr[i][j]==k)
                {
                	//还有k值则证明不连通
                    return false;
                }
            }
        }
        return true;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下坠丷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值