题目:
*寻找所有连接点 :有一个 n n 的整型二维数组,现随便输入一个数组内的节点坐标,请输入与此节点连接在一起的所有值相同的节点的坐标。
注意:如果起点四周的某点满足条件,则需要在该点的四周继续寻找,直到找完为止,定义“相连”:上下左右四个方向相邻的点为相连;斜方向上不算相连
举例:输入数组如图:
**
当输入(2, 1)后,即图中黄底的节点,则与其连接在一起相同节点为(2,0)(2, 1)(2, 2)(2, 3)(3, 3),即图中红色标记的节点。
void findConnected(int array[][], int n, int x, int y){
//array 要查找的数组
//n 代表数组的大小
//x,y 输入坐标
}
解题思路:
- 首先,该题类似于栈走迷宫算法,但相对于来说比其简单,只是其中的一小部分,因为他不需要找不到通路就返回,而他只需要找到之后输入坐标即可。(迷宫问题的本质是利用栈LIFO性质来递归解决问题)
- 因为所有的坐标都是动态的,而且要求:
- 条件:相连的(这是规律),一旦不连,则不计入。上下左右查找,符合条件的存起来, 可以用递归解决。
代码:
//定义一个集合,用来存取符合的坐标
HashSet<int[][]> set = new HashSet<> ();
...
void findConnected(int array[][], int n, int x, int y){
//获取输入坐标的值,用来判断
int count = array[x][y];
//将坐标以数组的形式存到集合中
int[][] arr = {{x,y}};
//判断给出的x,y值是否符合范围
if( x > n-1 || y > n-1){
return;
}
//一旦二次进入,说明符合条件,所以存到set集合中,不符合的话不会进入
if(!set.contains (arr)){
set.add (arr);
}
//递归
if(array[x-1][y] == count){ //左移
findConnected(array,n,x-1,y);
}else if(array[x+1][y] == count){ //右移
findConnected(array,n,x+1,y);
}else if(array[x][y-1] == count){ //下移
findConnected(array,n,x,y-1);
}else if(array[x][y+1] == count){ //上移
findConnected(array,n,x,y+1);
}
}
最后坐标都存到了set集合中。