一维数组上的回溯 #include <iostream> #include <cstring> #include <cmath> #include <cstdio> using namespace std ; const int maxn = 8 + 2 ; int n , vis[maxn] ; int x[maxn] , y[maxn] , ans[maxn] , tans[maxn] ; double d[maxn][maxn] ; double mmin ; double dis( int a , int b , int c , int d ) { return sqrt( ( a - c ) * ( a - c ) + ( b - d ) * ( b - d ) ) ; } void dfs( int cur ) { if( cur == n ) { double sum = 0 ; for( int i = 0 ; i < n -1 ; ++i ) { sum += d[tans[i]][tans[i+1]] ; } if( mmin > sum ) { memcpy( ans , tans , sizeof( tans ) ) ; mmin = sum ; } } else { for( int i = 0 ; i < n ; ++i ) if( !vis[i] ) { vis[i] = 1 ; tans[cur] = i ; dfs( cur + 1 ) ; vis[i] = 0 ; } } } int main() { int icase = 1 ; while( cin >> n ) { if( !n ) break ; memset( x , 0 , sizeof( x ) ) ; memset( y , 0 , sizeof( y ) ) ; memset( d , 0 , sizeof( d ) ) ; mmin = 1 << 31 -1 ; memset( vis , 0 , sizeof( vis ) ) ; for( int i = 0 ; i < n ; ++i ) { cin >> x[i] >> y[i] ; } for( int i = 0 ; i < n ; ++i ) for( int j = i + 1 ; j < n ; ++j ) { d[i][j] = d[j][i] = dis( x[i] , y[i] , x[j] , y[j] ) ; } dfs( 0 ) ; cout << "**********************************************************" << endl ; cout << "Network #" << icase++ << endl ; for(int i = 0 ; i < n-1 ; ++i ) { cout << "Cable requirement to connect ("<<x[ans[i]] << "," << y[ans[i]] << ") to (" <<x[ans[i+1]] << "," << y[ans[i+1]] << ") is " ; printf("%.2lf feet./n",d[ans[i]][ans[i+1]]+16 ) ; } cout << "Number of feet of cable required is "; printf("%.2lf./n" , mmin+(n-1)*16 ) ; } return 0 ; }