前提・実現したいこと
巡回セールスマン問題を解くためにプログラムを作成しました。
(出発点が'A'で'B','C','D','E'を経由したのち再び'A'に戻ってくるときの経路を表示するプログラム)
無事に解くことができ、最短経路が分かったのですが、地名(点の名前)を配列に入れていましたが、ほかの配列の値が代入されてしまいました。
初めは配列nameはchar型で{'B','C','D','E'}としていましたが、文字化けしていたので、int型の{1,2,3,4}にしてみたところ今回の配列distanceの値が配列nameに代入されていることが判明しました。
該当のソースコード
C
1#include <stdio.h> 2 3int main(void) { 4 int i1,i2,i3,i4; //ループ変数の宣言 5 int name[4] = {1,2,3,4}; //地名(点の名前) 初めはchar型で{'B','C','D','E'}としていた 6 7 int distance[5][5] = {0}; //すべての距離を0で初期化 8 9 //各距離の設定(distance[A][B]とは、地点Aから地点Bまでの距離を表す) 10 distance[0][1] = 5; distance[0][2] = 3; distance[0][3] = 10; distance[0][4] = 6; 11 distance[1][2] = 7; distance[1][3] = 14; distance[1][4] = 9; 12 distance[2][3] = 7; distance[2][4] = 3; 13 distance[3][5] = 5; 14 15 //逆のルートの距離の設定(A→Bの距離をB→Aにも適用) 16 for(i1=0;i1<6;i1++) { 17 for(i2=0;i2<6;i2++) { 18 distance[i2][i1] = distance[i1][i2]; 19 } 20 } 21 22 for(i1=0;i1<4;i1++) { 23 for(i2=0;i2<4;i2++) { 24 for(i3=0;i3<4;i3++) { 25 for(i4=0;i4<4;i4++) 26 if(!(i1==i2||i1==i3||i1==i4||i2==i3||i2==i4||i3==i4)) { //重複組み合わせを排除 27 printf("%d,%d,%d,%d:",name[i1],name[i2],name[i3],name[i4]); //通ったルートの表示 28 printf(" %d\n",distance[i1][i2] + distance[i2][i3] + distance[i3][i4] + distance[0][i1] + distance[i4][0]); //距離の表示 29 } 30 } 31 } 32 } 33 34 return 0; 35} 36
###実行結果
5,3,10,6: 29 5,3,6,10: 29 5,10,3,6: 34 5,10,6,3: 29 5,6,3,10: 34 5,6,10,3: 29 3,5,10,6: 30 3,5,6,10: 30 3,10,5,6: 35 3,10,6,5: 29 3,6,5,10: 35 3,6,10,5: 29 10,5,3,6: 35 10,5,6,3: 35 10,3,5,6: 35 10,3,6,5: 34 10,6,5,3: 30 10,6,3,5: 29 6,5,3,10: 35 6,5,10,3: 35 6,3,5,10: 35 6,3,10,5: 34 6,10,5,3: 30 6,10,3,5: 29
試したこと
・地名を格納した配列をchar型からint型に変更してみた。
・どこで地名が上書きされたのかのチェック。
・配列nameの宣言を「配列distanceの逆ルート設定」の後(21行目)に移動させたら、きちんと代入され、
1,2,3,4: 29 1,2,4,3: 29 1,3,4,2: 34
となりました。
補足情報(FW/ツールのバージョンなど)
>gcc --version gcc (MinGW.org GCC Build-20200227-1) 9.2.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。