“旅行推銷商問題”簡易暴力實現
阿新 • • 發佈:2018-11-08
應付離散實驗足夠了,但是還不會呼叫EasyX繪圖啊~~~
1 #include <bits/stdc++.h> 2 #include <windows.h> 3 4 int start = 0; 5 6 // 城市名稱 7 char city_name[6] = { 'A', 'B', 'C', 'D', 'E', 'F' }; 8 9 // 記錄到過的城市 10 int city[6] = {0}; 11 12 13 int pass_count = 0; // 記錄當前經到過的城市數量 14 char pass_path[7] = {0}; // 記錄路線 15 16 17 // 城市之間的路徑 18 int city_path[6][6] = 19 { 20 { 0, 6, 7, 2, 9, 16 }, // a 21 { 6, 0, 3, 11, 12, 15 }, // b 22 { 7, 3, 0, 9, 18, 5 }, // c 23 { 2, 11, 9, 0, 13, 18 }, // d 24 { 9, 12, 18, 13, 0, 13 }, // e 25 { 16, 15, 5, 18, 13, 0 } // f 26 }; 27 28 29 // 判斷是否已經到過a城市 30 bool ispassed( int a ) 31 { 32 return city[a] > 0; 33 } 34 35 void init() 36 { 37 start = 0; 38 pass_count = 0; 39 int i; 40 for( i = 0; i < 6; i ++ ) 41 { 42 city[i] = 0; 43 pass_path[i] = 0; 44 } 45 pass_path[i] = 0; 46 } 47 48 ////////////////////////////////////////////////////////////// 49 // 功能:找出與當前城市最近且沒有到達過的城市 50 // 引數:輸入當前城市a,輸出下一個城市b, 51 // 返回:兩個城市之間的路程 52 ////////////////////////////////////////////////////////////// 53 int calc_path( int a,int& b ) 54 { 55 int i =0; 56 int min = 1000; 57 b = 0; 58 for( i= 0; i < 6; i ++ ) 59 { 60 if( min > city_path[a][i] && !ispassed(i) ) 61 { 62 min = city_path[a][i]; 63 b = i; 64 } 65 } 66 if( min < 1000 ) 67 city[b] = 1; 68 return min; 69 } 70 71 72 bool input_city_num( int &city_num ) 73 { 74 char city_name = 'A'; 75 printf( "輸入起點城市編號(A~F或a~f):" ); 76 scanf( "%c", &city_name ); 77 if( city_name >= 'a' && city_name <= 'f' ) 78 city_name -= 32; 79 fflush(stdin); 80 81 city_num = city_name - 'A' + 1; 82 if( city_num > 7 || city_num <= 0 ) 83 { 84 return false; 85 } 86 return true; 87 } 88 89 90 void start_travel() 91 { 92 int city_num = 0; 93 int i = 0; 94 int path = 0; 95 int ret = 0; 96 int b; 97 98 // 初始化資料 99 init(); 100 101 // 輸入起始城市編號 102 while( !input_city_num(city_num) ) 103 { 104 printf( "輸入有誤,請重新輸入!\n" ); 105 } 106 107 city_num --; 108 city[city_num] = 1; 109 start = city_num; 110 pass_path[ pass_count ++ ] = city_name[city_num]; 111 112 // 開始旅行規劃 113 printf( "\n從城市[%c]出發\n" , city_name[city_num] ); 114 printf( "\n" ); 115 for( i = 0;i < 6; i ++ ) 116 { 117 b = 0; 118 ret = calc_path( city_num, b ); 119 if( ret > 0 && ret < 1000 ) 120 { 121 path += ret; 122 printf( "當前到達%c城市\n", city_name[b] ); 123 printf( "當前走過路程:%d", path ); 124 printf( "\n" ); 125 city_num = b; 126 pass_path[ pass_count ++ ] = city_name[city_num]; 127 } 128 } 129 130 // 回到起點 131 path += city_path[start][city_num]; 132 printf( "當前到達 %c 城市\n", city_name[start] ); 133 printf( "當前走過路程:%d", path ); 134 printf("\n"); 135 pass_path[pass_count++] = city_name[start]; 136 137 printf( "\n" ); 138 printf( "旅行結束,總路程為:%d\n路線:", path ); 139 for( i = 0; i < 7; i ++ ) 140 { 141 if( i !=6 ) 142 printf( "%c--->", pass_path[i] ); 143 else 144 printf( "%c", pass_path[i] ); 145 } 146 } 147 148 int main() 149 { 150 while(1) 151 { 152 start_travel(); 153 printf("\n----------------------------------------------------\n\n"); 154 } 155 return 0; 156 }