在2d矩阵中使用链接列表的Dfs - C

问题描述:

我得到了我的学校项目的任务,我不知道如何解决,我卡住了。我必须跑过这个迷宫:在2d矩阵中使用链接列表的Dfs - C

#T########### 
    #.#...R.....# 
    #.###.#.###.# 
    #...Q.#...#.# 
    #.#####C###F# 
    #.A.........# 
    #B#####E#K#L# 
    #.......#.#.# 
    ###D#H###.#.# 
    #...#...J.P.# 
    #G###X#####.# 
    #.........N.# 
    ############# 

而在这个矩阵中,我必须找到哪个重要点是其邻居使用链接列表。

这应该是代码的输出:

A: L K F E C T Q B 
    B: H E D T Q A 
    C: L K F E A R F 
    D: G H E B 
    E: H D B L K F C A 
    F: L K E C A R C 
    G: X N D 
    H: X J E D B 
    J: X H P K 
    K: P J L F E C A 
    L: P N K F E C A 
    N: X G P L 
    P: N L K J 
    Q: R T B A 
    R: F C Q 
    T: Q B A 
    X: N G J H 


    int rekurzia(int x,int y) 
    { 
    if ((x < 0) || (x > MAX - 1) || (y < 0) || (y > MAX - 1)) 
     return false; 
    if((matica[x][y] >= 'A') && (matica[x][y] <= 'Z')) 
     printf("%c\n", matica[x][y]); 
    if (matica[y][x] != '.') 
     return false; 
    if (rekurzia(x,y-1) == true) 
     return true; 
    if (rekurzia(x+1,y) == true) 
     return true; 
    if (rekurzia(x,y+1) == true) 
     return true; 
    if (rekurzia(x-1,y) == true) 
     return true; 
    return false; 
    } 

我做这样的事情。有人能帮我做我应该怎么做吗?谢谢 !

+3

太如现在所述那样广泛。发布你的代码并描述你的问题。 – LPs

这是一个针对学校项目的极具挑战性的问题!但看起来很有趣!如果我不得不解决这个问题,我会;

  1. 获取每个字母字符的所有地址,所以我知道,所有的启动点(走纯粹矩阵做一个循环内部(循环)
  2. 构建一个递归函数(即保持调用一个函数然后自己),我将允许功能;
    • 产卵关中4个向量(上,下,左,右)
    • 如果函数遇到一个“#”(墙),它会返回任何结果和停止,
    • 如果它找到了一个“。”走廊它wou ld在4个以上的向量中继续,
    • 如果遇到字母字符,则返回该字符。
  3. 对于每个已知的alpha位置调用递归函数并让它“漫游”。
  4. 加分,你可以使用并行编程,同时开始每个已知位置:)

陷阱: - 注意无尽的通话 - 不漫游过去矩阵的边界

+0

这里没有明显的需要使用递归。它应该像往常一样,避免像瘟疫一样,只能用作最后的手段。 – Lundin

+0

我想知道如何用线性程序来解决这个问题。我设法用c#编写了一个递归函数,它非常紧凑。我的结果在技术上更为正确,因为我首先找到最接近的点,而上面的结果并非如此。 –

+0

所有的递归都是保存以前的位置。它总是可以用一个循环和一个LIFO来代替之前的位置。或者,也可以使用包含指向父节点的指针的BST。唯一一次递归是“紧凑”的是编译器设法展开它,这通常需要尾递归。什么是“紧凑”,你的源代码,机器代码或堆栈使用情况?这三个中的第一个是非常不相关的。 – Lundin