dポイントプレゼントキャンペーン実施中!

↓の文を参考にして、深さ優先探索のプログラムを書いてみました。
が、自分(初心者)ではできてるように思えたんですが、全然ダメみたいです。
再帰の使い方がよく分かってないというのもあるのですが(すみません)。
もしよろしければアドバイスを頂けませんか?お願いします!

『・始点(ここでは「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;
}

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

お礼遅くなってすみませんm(_ _)m
プログラムも書いていただいて、感謝しております。
参考にさせていただきました!
ほんとうにありがとうございました!

お礼日時:2002/11/02 00:10

recursive functinの話以前に、関数の使い方や呼び方、


あと配列の宣言辺りが変ですよ。そこがきちんとできないと。
コンパイルの時点でエラーでません?

あと、2次元配列を使った縦型探索は初めて見ますが、
個人的にはポインタと構造体を使ったもののほうが
わかりやすいかと思います。
    • good
    • 0
この回答へのお礼

お礼遅くなってすみませんm(_ _)m
再帰に関して知識不足だったため、いちから勉強しなおしました。
時間をかけて作った結果、なんとかコンパイル・実行できました。
アドバイスありがとうございました!

お礼日時:2002/11/02 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!