24-4.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <limits.h>
  4. int find(char **species,int size,char *str){
  5. for(int i = 0; i<size;i++){
  6. if (strcmp(species[i], str) == 0)
  7. {
  8. return i;
  9. }
  10. }
  11. return -1;
  12. }
  13. // 传入咒语字符串数组(二维数组)eg. {{"猫","alal","鱼"},{x,x,x}} 代表猫变老鼠咒语为"alal"
  14. char *find_best_animal(char ***curses, int cursesSize)
  15. {
  16. char **species = (char **)malloc(sizeof(char *) * 2 * cursesSize);
  17. if(species == NULL){
  18. return "error,fail to malloc memory";
  19. }
  20. int size = 0;
  21. for(int i = 0;i<cursesSize;i++){ //统计个数并建立映射关系,时间复杂度为o(n^2),使用哈希表(c语言哈希表篇幅过长)可以降到o(1)
  22. for(int j=0;j<3;j++){
  23. if(j==1){
  24. continue;
  25. }
  26. if(find(species,size,curses[i][j])==-1){
  27. species[size++]=curses[i][j];
  28. }
  29. }
  30. }
  31. int **matrix = (int**)malloc(sizeof(int*) * size); // 准备空间以便后续弗洛伊德操作
  32. if(matrix == NULL){
  33. return "error,fail to malloc memory";
  34. }
  35. for(int i = 0; i < size; i++){
  36. matrix[i] = (int*)malloc(sizeof(int) * size);
  37. if(matrix[i] == NULL){
  38. // 释放之前分配的内存
  39. for(int j = 0; j < i; j++){
  40. free(matrix[j]);
  41. }
  42. free(matrix);
  43. return "error,fail to malloc memory";
  44. }
  45. // 初始化数组元素为-1
  46. memset(matrix[i], -1, sizeof(int) * size);
  47. }
  48. for(int i=0;i<cursesSize;i++){
  49. int x = find(species,size,curses[i][0]);
  50. int y = find(species,size,curses[i][2]);
  51. int len = strlen(curses[i][1]);
  52. // 保留最短路径
  53. if(matrix[x][y] == -1 || len < matrix[x][y]) {
  54. matrix[x][y] = len;
  55. }
  56. }
  57. for(int i = 0;i<size;i++){ // 实现弗洛伊德操作
  58. for(int j = 0;j<size;j++){
  59. if(j==i || matrix[j][i] == -1){
  60. continue;
  61. }
  62. for(int k = 0;k<size;k++){
  63. if(k==i || matrix[i][k] == -1 || j==k){
  64. continue;
  65. }
  66. // 更新最短路径
  67. if(matrix[j][k] == -1 || matrix[j][i] + matrix[i][k] < matrix[j][k]) {
  68. matrix[j][k] = matrix[j][i] + matrix[i][k];
  69. }
  70. }
  71. }
  72. }
  73. int res = -1;
  74. int min = INT_MAX;
  75. for(int i = 0;i<size;i++){
  76. int cost = 0;
  77. int valid = 1;
  78. for(int j = 0;j<size;j++){
  79. if(i != j){
  80. if(matrix[i][j] == -1){
  81. valid = 0;
  82. break;
  83. }
  84. cost += matrix[i][j];
  85. }
  86. }
  87. if(valid && min > cost){
  88. min = cost;
  89. res = i;
  90. }
  91. }
  92. // 释放内存
  93. for(int i = 0; i < size; i++){
  94. free(matrix[i]);
  95. }
  96. free(matrix);
  97. char *animal = res != -1 ? species[res] : NULL;
  98. free(species);
  99. return animal;
  100. }
备用站点 当前处于降级运行的备用站点,仅供应急访问,数据和功能可能不是最新。