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

时间:2017-03-02 04:49:16

标签: c arrays algorithm multidimensional-array

我一直在考虑如何从给定起点Arr [x] [y]中找到数组中的所有可到达点,其中可到达点是值与当前值相差不超过2的点职位价值。然后我想返回一个数组,该数组在所有可到达的位置都有1,而0在无法到达的位置。

假设Arr [6] [6]看起来像这样:

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

然后返回的数组看起来像

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种不同的情况,我将当前位置与其每个邻居进行比较,然后如果它们可以访问,则设置newArr [x] [y]到1.否则将其设置为0.有人可以解释我如何确定下一步的位置,以及如何跟踪我已经测试过的点?

在比较之后考虑原始数组中的位置[0] [0],因为可以向右或向下移动,我该如何决定?或者以某种方式两者都做?

3 个答案:

答案 0 :(得分:4)

您可能需要考虑类似flood fill算法的内容。您的“目标颜色”将是您的起点的值,您的“替换颜色”将是目标的±2内的任何点。而不是“绘制”您的数据数组,而是想要在返回数组中标记索引。 calloc是最初将返回数组归零的不错选择。

在评估起点后,您将评估该指数附近的指数。如果索引在您返回的数组中已标记为1,则可以忽略该索引,因为它已被算法覆盖。

答案 1 :(得分:3)

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

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

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

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个,以及需要由@Shayna Grose确认的value[x][y] - value[z][w] != 0可能的额外条件

[更新2]:恢复原状。 Per @Shayna Grose评论:不允许使用对角线(需要考虑4个邻居),而diff = 0就可以了。

答案 2 :(得分:0)

我认为你可以使用DFS(深度优先搜索)来解决这个问题。我认为BFS也行。 c代码:

#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;
}