検索結果 7 件
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
ご指摘ありがとうございます。 問題はnextの候補を現在のノードから4方向に絞っていることだと思われます 二角取りを作る、ということで探査範囲は4方向だ・・・と考えてあのようなコードにしてたのですが、それがいけなかったんですね; GRAMさんの指摘通りに、nextを求めている部分を現在のfor文から外して、全てのノードから候補を求めるように改変したところ、無事始点から全点への最短経路を求めることができました。 無事次に進むことができそうです。 質問に答えていただき、本当にありがとうございました!(*^-^) 以下改変後のコード void Search(int start) { int i,...
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
はい、boxさんが貼ってくださったような結果がでます、これだと9999の値の部分の探索が行えていないようなのと
たとえば一行目の左三つ目の部分は最短経路だと3でないとおかしいと思うのですが、うまくいきません
コードのどこかが悪いのだろうとは思うのですが、どこが悪いのかがわかりません;
あとprev[]についてですが、これは後々求める開始地点から終了地点までのルートを表示するときに辿れるよう記憶しています。
たとえば一行目の左三つ目の部分は最短経路だと3でないとおかしいと思うのですが、うまくいきません
コードのどこかが悪いのだろうとは思うのですが、どこが悪いのかがわかりません;
あとprev[]についてですが、これは後々求める開始地点から終了地点までのルートを表示するときに辿れるよう記憶しています。
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
>trueとfalseの定義がない 私の環境では問題なくコンパイルできるのですが・・・すみませんdefineしたほうがよかったですね #define TRUE 1 #define FALSE 0 >「移動先が壁ならば」という条件はどこに書いてあるんでしょうか。 大本のプログラムからこれらのコードを抜き出すときにミスしたみたいです;すいません 正しくはこうなります //確定済みか、あるいは移動先が壁ならばコンティニュー if( visit[ start + dn[i] ] != false || stage[ start + dn[i] ] == WALL ) continue; #ダイクス...
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
ご指摘を頂いた点などを色々と修正いたしました。 あまりレスを長くしすぎるのもアレですので、こちらを編集する形で失礼します。 box様から このコードは、ご自分のところで実際にコンパイルされたものですか? Y と _SIZE との間の空白には どういった意味があるのでしょうか。 という事でしたので 改めてダイクストラの部分を抜き出し、実際にコンパイル、実行できるようにしたコードを掲載いたします。 また、Yと_SIZEの間の空白は単純にコピーミスです。すいません; #include <stdio.h> #include <memory.h> #define X_SIZE 20 #define ...
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
Search関数を呼ぶ前に、ini_daikstra()という形で初期化関数を呼ぶようにしています。 //配列初期化 void ini_daikstra() { int i,j; //visit,cost,prevの初期化 for( i = 0; i < MAX_SIZE; i++ ){ visit[i] = TRUE; cost[i] = MAX_VALUE; prev[i] = 0; } //壁以外の場所を初期化 for( i = 1; i < Y_SIZE-1; i++ ){ for( j = 1; j < X_SIZE-1; j++ ){ visit[ i * X_SIZ...
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
Re: ダイクストラ法について
すみません、コードを貼った時点で満足してしまいました。(;==) 普段自分でしか見ないものですから、コメントも読みにくいかもしれませんが、このような感じでいいでしょうか; 不手際が多くてすみません、改めてご助言いただけると幸いです。 よろしくお願いします。 #define X_SIZE 20 //X軸の最大サイズ #define Y _SIZE 13 //Y軸の最大サイズ #define MAX_SIZE (X_SIZE * Y_SIZE) //最大サイズ #define WALL 9 //壁 //移動変位配列,UP,RIGHT,DOWN,LEFT int dn[4] = { -20, 1,...
- 14年前
- フォーラム: C言語何でも質問掲示板
- トピック: ダイクストラ法について
- 返信数: 17
- 閲覧数: 9183
ダイクストラ法について
初めまして、HamachiOnsen(はまち温泉)といいます。 いきなりですが、最近二角取り(四川省)をC言語を用いて作っています。 しかし、牌と牌の最短経路を算出するのにダイクストラ法を用いたところうまく動きません。 ある程度まで答えを求めてくれているようなのですが、答えをすべて出す前に終了してしまっているようです。 その結果、二角取りの二回まで曲がれる、という部分を調べる部分で答えが出ていないため 最終的にアクセス違反が起こり、プログラムが強制終了してしまいます。 具体的なコードは以下のような感じです。 #define X_SIZE 20 #define Y _SIZE 13 #de...