对数字进行计数和分组
假设我们有一个二维数组,例如,
a = [
[5,4,4],
[4,3,4],
[3,2,4]
]
我的目标是计算附近的数字组
对于这种情况 a [0] [0] = 5附近没有相同的数字 (a [0] [1],a [1] [0]不是5) 1组
a [0] [1] = 4在[0] [2],a [1] [2],a [2] [2]中具有相同的数字 2组
最后,在这种情况下,
在这个例子中将有6组二维数组。
测验(a)= 6 - >预期
编程语言并不重要。
有人可以为此提供一个很棒的算法吗? :(
答案 0 :(得分:0)
将数组位置的值作为变量,即 阵列[i] [j]; 然后循环检查
public void onClick(View v) {
int buttonId = v.getId();
if (buttonId == R.id.buttonViewPrevious)
if (currentBoothArrayIndex < boothArrayList.size() - 1) {
displayBoothInformation(--currentBoothArrayIndex);
} else if (buttonId == R.id.buttonViewNext)
if (currentBoothArrayIndex < boothArrayList.size() - 1) {
displayBoothInformation(++currentBoothArrayIndex);
}
}
可能不是最有效的,但非常简单。
答案 1 :(得分:0)
您可以使用广度优先搜索(BFS)。对于数组中的每个元素,将其标记为未访问。然后迭代每个元素,如果没有访问,则执行以下操作:
最后,您将获得每个元素的组号。
答案 2 :(得分:0)
DFS足以解决这个问题:
这是非常简单的递归函数: 我的伪代码在这里:
function DFS(x, y, regionId)
{
if (region[x,y] == regionId) return;
region[x,y] = regionId;
if (Inside(x-1, y) && (map[x-1,y] == map[x,y])) DFS(x-1, y, regionId);
if (Inside(x+1, y) && (map[x+1,y] == map[x,y])) DFS(x+1, y, regionId);
if (Inside(x, y-1) && (map[x,y-1] == map[x,y])) DFS(x, y-1, regionId);
if (Inside(x, y+1) && (map[x,y+1] == map[x,y])) DFS(x, y+1, regionId);
}
Populate()
{
int regionId = 0;
for(int i=0;i<maxX;i++)
for(int j=0;j<maxY;j++)
if (region[x,y] == 0)
{
DFS(i, j, ++regionId);
}
Console.Write("Total regions = " + regionId);
}
答案 3 :(得分:0)
正如Толя提到的,DFS是上述问题的解决方案。 我们使用DFS&amp; amp;将它们视为一个元素。我们为每个元素执行此过程。
以下是Java中的示例代码..
public void test(){
int[][] arr = new int[][]{ {5,4,4},
{4,3,4},
{3,2,4} };
int cols = arr[0].length;
int rows = arr.length;
int count=0;
//Iterate thru each element of the matrix
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(arr[i][j]==Integer.MIN_VALUE)
continue;
dfs(arr,arr[i][j],i,j);
count++;
// Printing after every iteration ( code not required, hence commented )
/* for(int i1=0;i1<rows;i1++){
for(int j1=0;j1<cols;j1++)
System.out.print(" "+arr[i1][j1]);
System.out.println();
}
System.out.println();*/
}
}
System.out.println("No.of.groups = "+count);
}
这是DFS功能
public void dfs(int[][] arr, int key,int row,int col){
if(row>=arr.length || row<0)
return;
if(col>=arr[0].length || col<0)
return;
if(arr[row][col]!=key || arr[row][col]==Integer.MIN_VALUE)
return;
// Marking the visited element as 'MIN_VALUE'
arr[row][col] = Integer.MIN_VALUE;
dfs(arr,key,row+1,col);
dfs(arr,key,row-1,col);
dfs(arr,key,row,col+1);
dfs(arr,key,row,col-1);
}