1

Java で FlowChart ダイアグラム エディタを作成しました。それは、フローチャートを描画し、それらを相互に接続して、2 つの配列を作成します。1 つはノードとラインの接続を示し、もう 1 つは要素同士の接続を示します。Begin Two And の開始からすべての方法を見つけなければなりません。たとえば、決定のためのダイヤモンドがある場合、2 つの別々の方法があります..このすべての方法を取得したい..どのアルゴリズムを使用する必要がありますか?

編集3: 解決済みこんにちは、私は自分の問題を自分で解決しました..ここに私のコード..))

 public void search(){
  //  System.out.print(map.length);

for(i=0;i<map.length;i++)

    visit[i]=0;

    visit[0]=1;

    find(0,map.length-1,1);
}



  public void  find(int i,int d,int step){

for(int j=0;j<map.length;j++){
 System.out.println(">>"+i+"->"+j);
    if(visit[j]!=0 || map[i][j]==0)

        continue;

    if(j==d){
        visit[j]=step;
        OutputCycle();
      visit[j]=0;
        return;

    }
System.out.println(""+i+" to "+j);
    visit[j]=step;
    find(j,d,step+1);
    visit[j]=0;




}


  }
public void OutputCycle(){
    System.out.println("OUTPUT");

    for(k=0;k<visit.length;k++){

         for(int i=0;i<visit.length;i++){
             if(visit[i]==k+1){
                 System.out.print(i);
             }
         }
    }
    System.out.println();
}

編集1:私が自分の問題に取り組んでいたので、一部を解決しましたが、間違いもありません...ここで私の問題の詳細な説明:要素間の接続を説明する配列があります

          j

       A  B  C  D  E 

    A  0  1  0  0  0 

    B  1  0  1  1  0 

i   C  0  1  0  0  1

    D  0  1  0  0  1

    E  0  0  1  1  0     

これは私の接続配列です..AからEまでのすべての方法を見つけようとしています

2通りあります

A->B->C->E

A->B->D->E

左から右に配列を検索する最初の方法を見つけることができます。1 が表示されたら、J の walu e を取り、i の J 番目の要素行に移動し、その要素を 2 にして [i,j+1] から検索を開始し、E に到達した場合は結果を送信します。

しかし、ここで私の問題は、最初の行の ecnd 検索で 1 が表示されず、2 行目に移動し、最初の要素 1 がありますが、最初の行を参照し、ループになります。

また、バックトラックを使用して DFS を使用しようとしましたが、すべてのパスを表示するのではなく、1 つのパスのみを表示します。

そして、1を見つけて[i、j]の検索を開始すると、列の下のすべてを0にしようとしましたが、2回目の検索では何も表示されず、私のarryテーブルは空白のテーブルになります))。

私は何かが欠けていることを知っていますが、それを理解することはできません..

編集2:

今、私は解決策を閉じましたが、再び問題があります。このコードを使用して、マトリックスからパスを計算しました

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
*
* @author Meko
*/
public class Main {

List visited = new ArrayList();
List allObjects = new ArrayList();
int map[][] = {{3, 1, 0, 0, 0},
    {1, 0, 1, 1, 0},
    {0, 1, 0, 0, 3},
    {0, 1, 0, 0, 3},
    {0, 0, 1, 1, 0}};
int i, j, k;

public Main() {

    ShowArray();
    System.out.println();
    find(0, 0);
    System.out.println();
    result();
    System.out.println();
    afterFind();
    System.out.println();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here

    new Main();

}

public void ShowArray() {

    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map.length; j++) {

            System.out.print(" " + map[i][j]);
        }
        System.out.println("");
    }


}

public void find(int sRow, int sCol) {


    for (i = sRow; i < map.length; i++) {
        for (j = sCol; j < map.length; j++) {


            if (map[i][j] == 1) {
                map[i][j] = 2;
                visited.add(" " + i + " " + j);
                for (k = i; k < map.length; k++) {
                    map[k][i] = 0;

                }
                find(j, i);
            } else if (map[i][j] == 3) {
                visited.add(" " + i + " " + j);
              for (k = i; k < map.length; k++) {
                    map[k][i] = 0;

                }
                System.out.println("Founded");
                map[i][j] = 2;
                find(0, 0);
            }
        }

    }
}

public void result() {
    System.out.println(visited);
}

public void afterFind() {

    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map.length; j++) {

            System.out.print(" " + map[i][j]);
        }
        System.out.println("");
    }

}

}

出力は終了です

3 1 0 0 0
1 0 1 1 0
0 1 0 0 3
0 1 0 0 3
0 0 1 1 0

創業 創業 創業

[ 0 0, 0 1, 1 2, 2 4, 1 3, 3 4]

0 2 0 0 0
0 0 2 2 0
0 0 0 0 2
0 0 0 0 2
0 0 0 0 0

2は、訪問して変更したことを意味します..問題は、訪問リストに追加することです

00 、 01 、 12 、 24 これは最初のパスですが、その後は 13,34 のみです。これは、配列の残りを 0 に変更して検索しないためです。どうすればこれを解決できますか? 00,01,12,24 および 00,01 または 10,13,34 でなければなりません。そして、これがDFSまたはBFSであるとは思いませんか?または、他の何か??

4

2 に答える 2

0

Floyd-Warshallアルゴリズムは、すべての頂点間の最短経路を計算します。最短パスを探しているのではなく、すべてのパスだけを探している場合は、2 つのノード間で徹底的な深さ優先検索を行うことでこれを実現できます。

ウィキペディアのグラフ アルゴリズムのページを参照することを強くお勧めします。

于 2010-03-16T22:33:39.850 に答える
0

あなたが考えていることは、コンパイラ オプティマイザが使用する種類の分析に非常に近いものです。フローチャート アイコンの代わりに、これらのオプティマイザはアセンブリ言語命令の「基本ブロック」で動作します。「基本ブロック」は、フローチャート アイコンと同様に、基本ブロックとフローチャート アイコンの両方の境界を示すフロー制御エッジによって定義されます。

このため、フローチャート グラフを操作する方法については、コンパイラの文献を参照することをお勧めします。特に、「def-use」や「到達定義」の問題などの「データフロー分析」について読みたいと思うでしょう。

あなたの質問に答えて、次のように有向グラフ走査アルゴリズムを実装できます。

/* Marks all flowchart icons as "unvisited." */
for (int i = 0; i < nodes.Count(); i++):
   node[i].visited = false

/* Schedule the Start node for processing. */
node_queue.push(nodes.start_node())

/* Traverse the graph. */
while (node_queue.not_empty()):
    current_node = node_queue.pop_front()

    calculations_on_node(current_node)

    current_node.visited = true

    for (int i = 0; i < current_node.outgoing_edges.Count(); i++):
        edge  = current_node.outgoing_edges[i]
        if (!edge.destination_node.visited):
            node_queue.push_back(edge.destination_node)

calculations_on_node意図したノードごとの作業を実行するために実装できます。

コンパイラーの最適化に関する優れた参考書として、Steven Muchnik 著のAdvanced Compiler Design and Implementationを参照することをお勧めします。
ムチニクブックの画像

于 2010-03-16T22:18:44.837 に答える