まだ初心者に毛が生えた程度のレベルです
課題として、
「今いくつかの点があり、その中からスタートとゴールを決め、スタートから残りすべての点をまわり、ゴールに着く」
というものなのですが、今プログラムを書いて、ゴールを決めずにスタートから全探索するものは書けたのですが、
ゴールを固定するとなると、わからなくなりました。
#include "stdafx.h"
#include <math.h>
//#define N 5 /* 点の個数 */
#define N 4 /* 点の個数 */
struct POINT{
double x,y; /* 座標用の変数 */
};
struct POINT data[N]={{0,0},{6,7},{3,5},{1,10},{10,6}}; /* 入力データ */
int root[N];
int root2[N]; /* 通った点を記憶 */
int flag[N]; /* 通ったか判定 */
double min = 1000000.0; /* 初期の長さ */
/**************************** 探索用 serch関数 **********************************************************/
void search(double sum,int n,int k){
//void search(int n,int k){
int i,j;
double x,y;
double d[N][N];/* 距離配列 */
double distance[N][N]; /* 距離記憶 */
double sum;
++k;
if(k > N-1){
if(min > sum){
min=sum;
for(i=0;i<N;++i){
root2[i]=root[i];
}
}
return;
}
for(i=0;i<N;i++){
for(j=1;j<N;j++){
d[i][j]=sqrt(((data[j].x-data[i].x)*(data[j].x-data[i].x))+((data[j].y-data[i].y)*(data[j].y-data[i].y)));
}
}
for(i=1;i<N;i++){
if(flag[i]==0){
sum=d[i][4];
if(min > sum+d[n][i]){
flag[i]=1;
distance[n][i]=d[n][i]; /* 距離記憶 */
root[k]=i; /* 点記憶 */
search(sum+d[n][i],i,k);
flag[i]=0;
}
}
}
}
/*************************** main関数 **********************************************/
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,a;
flag[0] = 1;
root[0] = 0;
search(0.0,0,0);
printf("経路 点\n");
for(i=0;i<N;i++){
a=root2[i];
printf("%4d %4d (%7.2f,%7.2f) \n",i,a,data[a].x,data[a].y);
}
printf("\nmin=%lf\n",min);
return 0;
}
/* 出力結果
経路 点
0 ( 0.00, 0.00)
1 ( 3.00, 5.00)
2 ( 1.00, 10.00)
3 ( 6.00, 7.00)
4 ( 10.00, 6.00)
min=21.170174
.*/
このプログラムをどう直せばよいでしょうか。。