巡回組み合わせの問題で5都市で順回路の組み合わせを考えるとき最初(最後)の都市は固定して良いので順回路の組み合わせの総数は4P4で24通り(1→2→3→4→5→1の2,3,4,5の並びが変化する)ですが、これをfor文を用いて表すとき
void SimpleOrder(struct TSP *tsp) { int order[N]; tsp->order[0]=0; for(tsp->order[1]=1;tsp->order[1]<N;tsp->order[1]++) { for(tsp->order[2]=1;tsp->order[2]<N;tsp->order[2]++) { for(tsp->order[3]=1;tsp->order[3]<N;tsp->order[3]++) { for(tsp->order[4]=1;tsp->order[4]<N;tsp->order[4]++) { q=0; if(tsp->order[4]==tsp->order[3] ||tsp->order[4]==tsp->order[2]||tsp->order[4]==tsp->order[1]) { }
このように4重のループによって解こうとしているのですが、この部分でどうコードを書いていけばよいかつまってしまいます。自分のこのやり方だと1→1→1→1→1→1のように重複ができてしまうのでそこも消せるようなプログラムを考えていますが、どのようにアプローチをかけていけばいいかが分かりません。アドバイスの方をよろしくお願いいたします。これは構造体の一部の関数のコードを切り取ったものです。
「順列 c言語」等で検索してみてください。
> 4重のループによって解こうとしている
4 重ループありきで作っているのでしょうか。
どうすれば出来るのかのイメージがあればそれでコードを書けるはずですが、「4 つの要素を変化させるから 4 重ループ」…というだけであれば、根本から考え直した方が良いかと思います。
まだ回答がついていません
会員登録して回答してみよう