经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
“旅行推销商问题”简易暴力实现
来源:cnblogs  作者:25th_engineer  时间:2018/10/21 20:08:11  对本文有异议

       应付离散实验足够了,但是还不会调用EasyX绘图啊~~~

  1. 1 #include <bits/stdc++.h>
  2. 2 #include <windows.h>
  3. 3
  4. 4 int start = 0;
  5. 5
  6. 6 // 城市名称
  7. 7 char city_name[6] = { 'A', 'B', 'C', 'D', 'E', 'F' };
  8. 8
  9. 9 // 记录到过的城市
  10. 10 int city[6] = {0};
  11. 11
  12. 12
  13. 13 int pass_count = 0; // 记录当前经到过的城市数量
  14. 14 char pass_path[7] = {0}; // 记录路线
  15. 15
  16. 16
  17. 17 // 城市之间的路径
  18. 18 int city_path[6][6] =
  19. 19 {
  20. 20 { 0, 6, 7, 2, 9, 16 }, // a
  21. 21 { 6, 0, 3, 11, 12, 15 }, // b
  22. 22 { 7, 3, 0, 9, 18, 5 }, // c
  23. 23 { 2, 11, 9, 0, 13, 18 }, // d
  24. 24 { 9, 12, 18, 13, 0, 13 }, // e
  25. 25 { 16, 15, 5, 18, 13, 0 } // f
  26. 26 };
  27. 27
  28. 28
  29. 29 // 判断是否已经到过a城市
  30. 30 bool ispassed( int a )
  31. 31 {
  32. 32 return city[a] > 0;
  33. 33 }
  34. 34
  35. 35 void init()
  36. 36 {
  37. 37 start = 0;
  38. 38 pass_count = 0;
  39. 39 int i;
  40. 40 for( i = 0; i < 6; i ++ )
  41. 41 {
  42. 42 city[i] = 0;
  43. 43 pass_path[i] = 0;
  44. 44 }
  45. 45 pass_path[i] = 0;
  46. 46 }
  47. 47
  48. 48 //////////////////////////////////////////////////////////////
  49. 49 // 功能:找出与当前城市最近且没有到达过的城市
  50. 50 // 参数:输入当前城市a,输出下一个城市b,
  51. 51 // 返回:两个城市之间的路程
  52. 52 //////////////////////////////////////////////////////////////
  53. 53 int calc_path( int a,int& b )
  54. 54 {
  55. 55 int i =0;
  56. 56 int min = 1000;
  57. 57 b = 0;
  58. 58 for( i= 0; i < 6; i ++ )
  59. 59 {
  60. 60 if( min > city_path[a][i] && !ispassed(i) )
  61. 61 {
  62. 62 min = city_path[a][i];
  63. 63 b = i;
  64. 64 }
  65. 65 }
  66. 66 if( min < 1000 )
  67. 67 city[b] = 1;
  68. 68 return min;
  69. 69 }
  70. 70
  71. 71
  72. 72 bool input_city_num( int &city_num )
  73. 73 {
  74. 74 char city_name = 'A';
  75. 75 printf( "输入起点城市编号(A~F或a~f):" );
  76. 76 scanf( "%c", &city_name );
  77. 77 if( city_name >= 'a' && city_name <= 'f' )
  78. 78 city_name -= 32;
  79. 79 fflush(stdin);
  80. 80
  81. 81 city_num = city_name - 'A' + 1;
  82. 82 if( city_num > 7 || city_num <= 0 )
  83. 83 {
  84. 84 return false;
  85. 85 }
  86. 86 return true;
  87. 87 }
  88. 88
  89. 89
  90. 90 void start_travel()
  91. 91 {
  92. 92 int city_num = 0;
  93. 93 int i = 0;
  94. 94 int path = 0;
  95. 95 int ret = 0;
  96. 96 int b;
  97. 97
  98. 98 // 初始化数据
  99. 99 init();
  100. 100
  101. 101 // 输入起始城市编号
  102. 102 while( !input_city_num(city_num) )
  103. 103 {
  104. 104 printf( "输入有误,请重新输入!\n" );
  105. 105 }
  106. 106
  107. 107 city_num --;
  108. 108 city[city_num] = 1;
  109. 109 start = city_num;
  110. 110 pass_path[ pass_count ++ ] = city_name[city_num];
  111. 111
  112. 112 // 开始旅行规划
  113. 113 printf( "\n从城市[%c]出发\n" , city_name[city_num] );
  114. 114 printf( "\n" );
  115. 115 for( i = 0;i < 6; i ++ )
  116. 116 {
  117. 117 b = 0;
  118. 118 ret = calc_path( city_num, b );
  119. 119 if( ret > 0 && ret < 1000 )
  120. 120 {
  121. 121 path += ret;
  122. 122 printf( "当前到达%c城市\n", city_name[b] );
  123. 123 printf( "当前走过路程:%d", path );
  124. 124 printf( "\n" );
  125. 125 city_num = b;
  126. 126 pass_path[ pass_count ++ ] = city_name[city_num];
  127. 127 }
  128. 128 }
  129. 129
  130. 130 // 回到起点
  131. 131 path += city_path[start][city_num];
  132. 132 printf( "当前到达 %c 城市\n", city_name[start] );
  133. 133 printf( "当前走过路程:%d", path );
  134. 134 printf("\n");
  135. 135 pass_path[pass_count++] = city_name[start];
  136. 136
  137. 137 printf( "\n" );
  138. 138 printf( "旅行结束,总路程为:%d\n路线:", path );
  139. 139 for( i = 0; i < 7; i ++ )
  140. 140 {
  141. 141 if( i !=6 )
  142. 142 printf( "%c--->", pass_path[i] );
  143. 143 else
  144. 144 printf( "%c", pass_path[i] );
  145. 145 }
  146. 146 }
  147. 147
  148. 148 int main()
  149. 149 {
  150. 150 while(1)
  151. 151 {
  152. 152 start_travel();
  153. 153 printf("\n----------------------------------------------------\n\n");
  154. 154 }
  155. 155 return 0;
  156. 156 }

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号