↓の文を参考にして、深さ優先探索のプログラムを書いてみました。
が、自分(初心者)ではできてるように思えたんですが、全然ダメみたいです。
再帰の使い方がよく分かってないというのもあるのですが(すみません)。
もしよろしければアドバイスを頂けませんか?お願いします!
『・始点(ここでは「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;
}
No.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;
}
お礼遅くなってすみませんm(_ _)m
プログラムも書いていただいて、感謝しております。
参考にさせていただきました!
ほんとうにありがとうございました!
No.1
- 回答日時:
recursive functinの話以前に、関数の使い方や呼び方、
あと配列の宣言辺りが変ですよ。そこがきちんとできないと。
コンパイルの時点でエラーでません?
あと、2次元配列を使った縦型探索は初めて見ますが、
個人的にはポインタと構造体を使ったもののほうが
わかりやすいかと思います。
お礼遅くなってすみませんm(_ _)m
再帰に関して知識不足だったため、いちから勉強しなおしました。
時間をかけて作った結果、なんとかコンパイル・実行できました。
アドバイスありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
エラー 添字が付けられた値が、...
-
c++でテンプレートのコードでわ...
-
構造体の勉強中です 合計点の高...
-
C言語 配列と関数の練習問題
-
#define _CRT_SECURE_NO_WARNIN...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
C言語での奇数の和
-
比較回数と交換回数表示について
-
商と剰余を同時に求める(C言語)
-
(マルチスレッド)_beginthrea...
-
acceptをalarmでタイムアウトさ...
-
(int *)の意味
-
C言語で分からないところがあり...
-
課題なんですが・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
へんな現象
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
if と配列の組み合わせ
-
C言語での奇数の和
-
C言語 配列と関数の練習問題
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
C言語
-
実数の整数部,小数部の取得
-
足して100になるような乱数のア...
-
卒業研究でよく分からないとこ...
-
数字列を3桁ごとにカンマで区切...
-
c言語
-
std::set<int> で、ある値が何...
-
比較回数と交換回数表示について
おすすめ情報