首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C中遍历数组并找到所有可达点?

如何在C中遍历数组并找到所有可达点?
EN

Stack Overflow用户
提问于 2017-03-02 12:49:16
回答 3查看 633关注 0票数 2

我一直在思考如何从给定的起点Arrx找到数组中的所有可达点,其中可达点是指与当前位置值相差不超过2的点。然后我想返回一个数组,它在所有可及位置都有1,在不可达位置有0。

假设Arr6看起来像这样:

代码语言:javascript
运行
复制
10 11 14 18 20 20 
11 12 11 19 20 20 
24 28 12 15 18 31
44 46 13 12 57 30
42 45 10 14 59 31
38 42 46 16 16 23

则返回的数组将如下所示

代码语言:javascript
运行
复制
1 1 0 0 0 0 
1 1 1 0 0 0
0 0 1 0 0 0
0 0 1 1 0 0
0 0 0 1 0 0
0 0 0 1 1 0

我认为实现这一点的最好方法是创建一个newArr,然后有4种不同的情况,将当前位置与其相邻位置进行比较,然后如果它们是可到达的,则将newArrx设置为1。否则将其设置为0。有人能解释一下我如何确定下一步要移动到哪里,以及如何跟踪我已经测试过的点吗?

考虑在原始数组中的位置,经过比较,既然有可能向右或向下移动,我该如何决定?还是两者兼而有之?

EN

回答 3

Stack Overflow用户

发布于 2017-03-02 12:58:54

您可能需要考虑flood fill算法之类的东西。您的“目标颜色”将是您的起始点的值,而您的“替换颜色”将是目标的±2范围内的任何点。与其“绘制”数据数组,不如标记返回数组中的索引。calloc是最初将返回数组置零的好选择。

在评估您的起点之后,您将评估与该指标相邻的指标。如果一个索引在你返回的数组中被标记为1,你可以忽略这个索引,因为它已经被算法覆盖了。

票数 4
EN

Stack Overflow用户

发布于 2017-03-02 13:20:41

你走在正确的道路上。是的,你需要检查一下邻居。您可以根据与所有4个邻居(或更少的邻居,取决于位置)的比较来做出决定。

这是一个典型的BFS问题。Look herehere.You从一个点开始,然后转到邻居处进行检查(这取决于您正在解决的问题),并更新结果矩阵并继续进行。

通常,队列用于实现BFS。下面是算法:

代码语言:javascript
运行
复制
Set result [n][n] as all zero
Insert the beginning point (i,j) to a queue Q
result[i][j] = 1  // the starting point is reachable from itself
While queue is not empty:
  Take point (x,y) from Q 
     For each neighbor (z,w) of (x,y):  //which are north, south, east, west
       if (result[z][w] == 0 && | value[x][y] - value[z][w] | <= 2) {
          result[z][w] = 1
          push point(z,w) into Q
       }

更新1:感谢@Jonathan Leffler的评论,指出了8个邻居,而不是4个,以及value[x][y] - value[z][w] != 0可能的额外情况,需要@Shayna Grose确认

更新2:恢复。根据@Shayna Grose的评论:对角线是不允许的(需要考虑4个邻居),diff =0是可以的。

票数 3
EN

Stack Overflow用户

发布于 2017-03-02 16:44:01

我认为你可以使用深度优先搜索来解决这个problems.and,我认为深度优先搜索也是可以的。C代码:

代码语言:javascript
运行
复制
#include <stdio.h>

int row,col,x,y;
int a[6][6]={
50,51 ,54, 58, 60, 60,
48, 52, 51, 59, 60, 60, 
44, 48, 52, 55, 58, 61,
44, 46, 53, 52, 57, 60,
42, 45, 50, 54, 59, 61,
38, 42, 46, 56, 56, 63
};// the date
int vis[6][6];// the result
int dir[4][2]={
    1,0,0,1,0,-1,-1,0
};
void dfs(int x,int y){
    for(int i=0;i<4;i++){  //4 direction
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(!vis[nx][ny]&&abs(a[nx][ny]-a[x][y])<=2&&nx>=0&&ny>=0&&nx<6&&ny<6){
            vis[nx][ny]=1;
            dfs(nx,ny);
        }
    }
}
int main()
{
    vis[6][6]={0};
    scanf("%d%d",&x,&y);
    vis[x][y]=1;
    dfs(x,y);
    for(int i=0;i<6;i++){
        for(int j=0;j<6;j++){
            printf("%d",vis[i][j]);
        }
        printf("\n");
    }
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42547101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档