我一直在考虑如何从给定起点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],因为可以向右或向下移动,我该如何决定?或者以某种方式两者都做?
答案 0 :(得分:4)
您可能需要考虑类似flood fill算法的内容。您的“目标颜色”将是您的起点的值,您的“替换颜色”将是目标的±2内的任何点。而不是“绘制”您的数据数组,而是想要在返回数组中标记索引。 calloc
是最初将返回数组归零的不错选择。
在评估起点后,您将评估该指数附近的指数。如果索引在您返回的数组中已标记为1,则可以忽略该索引,因为它已被算法覆盖。
答案 1 :(得分:3)
你走在正确的道路上。是的,你需要检查邻居。您可以根据与所有4个邻居的比较做出决定(或者更少,具体取决于位置)。
这是典型的BFS问题。查看here和here。从一个点开始,然后转到邻居并进行检查(这取决于您正在解决的问题),并更新结果矩阵并继续。
通常,队列用于实现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;
}