- ベストアンサー
深さ優先探索について・・・
↓の文を参考にして、深さ優先探索のプログラムを書いてみました。 が、自分(初心者)ではできてるように思えたんですが、全然ダメみたいです。 再帰の使い方がよく分かってないというのもあるのですが(すみません)。 もしよろしければアドバイスを頂けませんか?お願いします! 『・始点(ここでは「1」)を出発して、番号が小さい順に進む位置を調べていき 行けるところ(辺でつながっていて、まだ未訪問の節点)まで進む。 ・行き場所が無くなったら、行けるところがある節点まで戻っ(再帰をリターンし) て再び進めるだけ進む。 ・行き場所がなくなったなら終了(再帰からリターン) プログラムの際に節点iから節点jへ進めるか否かは節点と枝の関係を表すテーブル(これを隣接行列と言う)の要素a[i][j]の値が1であり、かつ訪問フラグv[j]が0であった時です。 訪問フラグは初期値に0を入れ(未訪問を表す)、 節点jが訪問されたならv[j]に1を入れます』 #include<stdio.h> int recurse(int i,int j); int main(void){ int recurse(int i,int j); return 0; } int recurse(int i,int j){ int v[j]; int a[i][j]; v[j]=0; v[0]=0; a[i][j]={{0,1,1,0,0,0,0,0}, {1,0,0,1,0,0,0,0}, {1,0,0,1,0,0,0,0}, {0,1,1,0,1,0,0,0}, {0,0,0,1,0,1,0,1}, {0,0,0,0,1,0,1,0}, {0,0,0,0,0,1,0,1}, {0,0,0,0,1,0,1,0}}; for(i=0;i<8;i++){ for(j=0;j<8;j++){ if(a[i][j] == 1 && v[j] == 0){ v[j]=1; printf("%d->%d ",i,j); break; } else return 0; } } return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
C言語の基礎から学んだ方がいいと思いますが、 こういうことでしょうか? #define N 8 char v[N] = { 0, 0, 0, 0, 0, 0, 0, 0 }; char a[N][N] = { { 0, 1, 1, 0, 0, 0, 0, 0 }, { 1, 0, 0, 1, 0, 0, 0, 0 }, { 1, 0, 0, 1, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 0, 0, 0 }, { 0, 0, 0, 1, 0, 1, 0, 1 }, { 0, 0, 0, 0, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 0, 1 }, { 0, 0, 0, 0, 1, 0, 1, 0 } }; void recurse(int i) { int j; printf(" %d", i+1); v[i] = 1; for(j = 0; j < N; j++) if(a[i][j] && !v[j]) recurse(j); } void dfs() { int i, cnt = 0; for(i = 0; i < N; i++) if(!v[i]) { printf("%d:", ++cnt); recurse(i); printf("\n"); } } int main(int argc, char *argv[]) { dfs(); return 0; }
その他の回答 (1)
- hogeta
- ベストアンサー率14% (4/28)
recursive functinの話以前に、関数の使い方や呼び方、 あと配列の宣言辺りが変ですよ。そこがきちんとできないと。 コンパイルの時点でエラーでません? あと、2次元配列を使った縦型探索は初めて見ますが、 個人的にはポインタと構造体を使ったもののほうが わかりやすいかと思います。
お礼
お礼遅くなってすみませんm(_ _)m 再帰に関して知識不足だったため、いちから勉強しなおしました。 時間をかけて作った結果、なんとかコンパイル・実行できました。 アドバイスありがとうございました!
お礼
お礼遅くなってすみませんm(_ _)m プログラムも書いていただいて、感謝しております。 参考にさせていただきました! ほんとうにありがとうございました!