2017-05-09 1 views
0

私は学校のプロジェクトのために解決する方法が分からず、私は立ち往生していません。私はこの迷路を乗り越えなければなりません:DFSはリンクリストを2次元マトリックスに使用しています - 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

これは、学校のプロジェクトにとって非常に挑戦的な問題です。しかし、楽しみのように見えます!

私はこれを解決しなければならないでしょう。

  1. すべての開始点は、(単にそれを行うための行列を歩く(ループ内のループ)
  2. 再帰関数(呼び出し続ける機能を構築しているところ、私が知っているように、各英字のすべてのアドレスを取得します。自身)と私は、関数へのを可能にする;。上、下、右、左4つのベクトル()で
    • 卵オフ
    • 関数は何も返さないだろう「#」(壁)に遭遇している場合停止、
    • "。"廊下が見つかった場合ldはアルファ文字がある場合は
    • の4つのベクトルに続き、その文字を返します。
  3. それぞれの既知のアルファ位置について、再帰関数を呼び出してローミングさせます。余分なポイントのため
  4. あなたは同時に、各既知の位置を開始するために並列プログラミングを使用することができます:)

落とし穴: - 無限の通話 に気を付けるには - あまりにも行列

+0

ここでは再帰を使用する必要はありません。それはいつものように、疫病のように避け、最後の手段としてのみ使用すべきです。 – Lundin

+0

私はリニアプログラムでどのように解決するのか興味があります。私はC#で再帰関数を使ってこれを構築しましたが、それはかなりコンパクトです。私の結果は技術的にはより正確です。私は最も近い点を先に見つけます。これは上記の結果には当てはまりません。 –

+0

再帰はすべて前の場所を保存することです。それは常に前の場所を保持するループとLIFOで置き換えることができます。または、親ノードへのポインタを保持するBSTを使用します。唯一の時間再帰は、コンパイラが展開を管理するときに「コンパクト」になります。これはしばしば末尾再帰を必要とします。 「コンパクト」、ソースコード、マシンコード、またはスタックの使用状況は正確に何ですか?これら3つのうちの最初のものは全く無関係です。 – Lundin

関連する問題