对昨天笔试题的一些总结

昨天下午,投的实习简历终于有了消息。HR发过来一套笔试题,共四个题。要求一小时之内做完并发过去,这是第一次收到这么正式的笔试题,虽然是自己线下在家里做的,但心里难免紧张。

下面是最后一个题,感觉有思路,但当时没写出来。

*寻找所有连接点 :有一个 n n 的整型二维数组,现随便输入一个数组内的节点坐标,请输入与此节点连接在一起的所有值相同的节点的坐标。

这里写图片描述**

当输入(2, 1)后,即图中黄底的节点,则与其连接在一起相同节点为(2,0)(2, 1)(2, 2)(2, 3)(3, 3),即图中红色标记的节点。

请完成以下函数:
void find_connected(int[][] array, int n, int x, int y)
//  array:要查找的数组
//  n:array的大小(n*n大小) 
//  x, y :输入的坐标

//给出辅助函数:
void set_add(x, y)//将坐标(x, y)放入set中,若set中已存在该坐标,则不放入
void set_del(x, y)//将坐标从set中删除
bool set_has(x, y)//判断(x, y)是否已存在set中
void set_print()//将set中所有坐标输出

思路:该问题与曾经数据结构实习中做过的利用栈的性质走迷宫类似,迷宫问题是利用栈LIFO性质来递归解决问题。刚拿到该问题时,看到 N * N的数组首先就想能否借鉴迷宫的思想来解决。

迷宫是从给定入口处(在不越界的情况下)沿着一条通路走到出口,并输出行走的路径。该问题恰好是迷宫问题的一小部分,因为不必像迷宫那样找不到通路还要按原路返回。该问题只是将相连的且相等的值的坐标输出即可。

下面是辅助函数写的代码:

void find_connected(int array[][], int n, int x, int y)
{
    int temp = array[x][y];
    if(x > n - 1 || y > n - 1)
        return;

    while(!set_has(x, y))
    {
        set_add(x, y);
    }
    if(temp == array[x - 1][y])
        find_connected(array, n, x - 1, y);
    else if(temp == array[x + 1][y])
        find_connected(array, n, x + 1, y);
    else if(temp == array[x][y + 1])
        find_connected(array, n, x, y + 1);
    else if(temp == array[x][y - 1])
        find_connected(array, n, x, y - 1);
}

猜你喜欢

转载自blog.csdn.net/sinat_31508159/article/details/50553583