【问题标题】:Find similar connected neighbours of a selected cell to form a cluster找到选定单元格的相似连接邻居以形成集群
【发布时间】:2019-05-30 02:32:54
【问题描述】:

我是新来的,这可能是对以前帖子的重复,但我找不到具体的内容。我有一个包含随机 4 个值(0、1、2、3)的二维网格。我想建立一种算法,找到一个特别选定的单元格的所有连接邻居(可以通过只给出一个单元格的索引来传递)并突出显示它们。

例如:

我有一个二维数组:

[0 0 1 0 3 2 0]

[1 3 1 2 1 0 0]

[3 2 3 1 1 1 2]

[0 0 1 2 2 1 0]

[3 2 1 2 1 1 0]

例如,如果用户选择数字 1(上面以粗体突出显示的元素),我想找出它所属的集群并突出显示它。只搜索上、下、左、右,没有对角线。

任何帮助将不胜感激。

【问题讨论】:

  • 如果您期望问题中的实际代码,您应该将其限制为一种编程语言,在 c# 和 c 之间进行选择。你在用什么编码?
  • 实际上语言并不是真正的约束。在任何一个都可以。我现在正在研究 C#

标签: c# c algorithm search


【解决方案1】:

您可以使用队列和布尔数组来实现 BFS,如下所示:

 void BFS(int srcR, int srcC, int n, int m, int** grid, bool* vis){
     int dr[] = {1, -1, 0, 0};    //The change in row
     int dc[] = {0, 0, 1, -1};    //The change in column
     int target = grid[srcR][srcC];
     memset(vis, 0, sizeof vis);
     queue<pair<int, int> > q;
     q.push({srcR, srcC});
     vis[srcR][srcC]=1;
     while(!q.empty()){
        int ur = q.front().first, uc = q.front().second;
        q.pop();
        for(int k= 0 ; k < 4 ; ++k){     //The 4 directions we are going to traverse.
            int vr = ur + dr[k], vc = uc + dc[k];
            if(vr>=0 && vr<n && vc>=0 && vc<m && grid[vr][vc] == target && !vis[vr][vc]){
                  vis[vr][vc]=1;
                  q.push({vr, vc});
             }
         }
     }
 }

此函数完成后,您将拥有 vis 数组,其中的数组表示连接的组件。

如果有任何错误,我很抱歉,因为我是通过电话写的。

【讨论】:

    【解决方案2】:

    您正在寻找graphconnected component,可以通过depth-first search 找到。基本上你会递归地将起始节点的所有邻居添加到输出中;细节取决于具体的底层实现。

    【讨论】:

    • 好答案。我个人会说广度优先搜索在 2D 平面上看起来更自然,我会这样做,但这只是我的意见:)
    • 您好,谢谢 Codor!我找到了这些文章,并决定首先构建一些东西来实现深度。现在我在网上找到的大多数算法要么是针对特定不相关问题的特定代码,要么是使用数学等过于理论化。有人可以用简单的英语给我几个步骤,说明所有算法应该逐步执行什么以获得结果吗?我可以自己将其转换为代码。非常感谢!
    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2014-12-14
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多