栈的迷宫算法——衍生出来的面试题Java版

题目:

*寻找所有连接点 :有一个 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集合中。

猜你喜欢

转载自blog.csdn.net/zz18435842675/article/details/82178936