bldmtx.c

来自「求解tsp问题的局部优化算法」· C语言 代码 · 共 189 行

C
189
字号
/*
        HEADER:         CUG000.12;
        TITLE:          BuildMatrix (main), InputMatrix, OutputMatrix;
        DATE:           Mar 89;
        DESCRIPTION:    Prompts User for Data to Build Distance Matrix;
        VERSION:        2.0;
        FILENAME:       BLDMTX.C;
        SEE-ALSO:       TSP.C, NN.C, POPT.C, 2OPT.C, HYBRID.C, 3OPT.C, FN.C,
                        BOOLEAN.H, NODELIST.H, TSP.H,
                        PRTMTX.C, TIME.C;
        AUTHORS:        Kevin E. Knauss;
*/

#include <stdio.h>
#include <tsp.h>

main ()
{
   char *Names[];
   unsigned Network[MAXROWS][MAXCOLS];
   unsigned NumberOfVirteces;
   char *filename;
   FILE *fp;

   printf("\n\n");
   NumberOfVirteces = InputMatrix (Network, Names);
   /* Open output and print headers */
      printf("\n\n\n****************************************");
      printf("\n\nInput filename for output: ");
      if (gets(filename) == NULL) {
         printf("\n*******************************************");
         printf("\n   Execution Terminated At User Request!");
         printf("\n*******************************************\n\n");
         exit(-1);
      }
      printf("\n\nOutput will be written to: %s\n\n", filename);
      if (filename == "stdout")
         fp = stdout;
      else
         if ((fp = fopen (filename, "w")) == NULL) {
            printf("\n*******************************************");
            printf("\n   Execution Terminated - Invalid Open!");
            printf("\n*******************************************\n\n");
            exit(-1);
         }
   OutputMatrix (fp, Network, Names, NumberOfVirteces);
   /* Clean up and go */
      fclose (fp);
      printf("\n*******************************************");
      printf("\n        Execution Terminated Normally!");
      printf("\n*******************************************\n\n");
} /* BuildMatrix - main */
   

unsigned InputMatrix (Network, Names)
   unsigned *Network[];
   char *Names[];
{
   unsigned NumberOfVirteces;
   unsigned index, FirstIndex, SecondIndex, dist;
   char *Answer;
   char ch;
   long atol ();
   printf("Input number of virteces to be entered: ");
   scanf ("%u", NumberOfVirteces);
   for ( index = 1; index <=  NumberOfVirteces; index++) {
      printf("Input name for virtex #%2u: ", index);
      scanf("%s", Names [index]);
   }
   printf("Are the distances between virteces symetric? (Y|N): ");
   scanf ("%s", Answer);
   if ((Answer [0] == 'n') || (Answer [0] == 'N')) {
      FirstIndex = 1;
      do {
         SecondIndex = 1;
         do {
            if (FirstIndex != SecondIndex) {
               printf("Input distance from %s", Names [FirstIndex]);
               printf(" to %s:", Names [SecondIndex]);
               scanf ("%s", Answer);
               ch = Answer [0];
               if ((ch == 'b') || (ch == 'B') ||
                  ((ch != NULL) && (ch < ' '))) {
                  FirstIndex = NumberOfVirteces;
                  SecondIndex = FirstIndex + 1;
               }
               if (ch == NULL) {
                  printf("\nWARNING: Matrix will not be complete!\n");
                  Network [FirstIndex][SecondIndex] = MAXCARD;
                  SecondIndex++;
               } else {
                  if ((ch != 'd') && (ch != 'D'))
                     dist = (unsigned) atol(Answer);
                  if (dist > 0) {
                     Network [FirstIndex][SecondIndex] = dist;
                     SecondIndex = SecondIndex + 1;
                  } else {
                     if (ch == '-') {
                        do {
                           if (--SecondIndex < 1) {
                              if (FirstIndex > 1) {
                                 FirstIndex--;
                                 SecondIndex = NumberOfVirteces;
                              } else {
                                 FirstIndex = 1;
                                 SecondIndex = 2;
                              }
                           }
                        } while (FirstIndex == SecondIndex);
                     }
                  }
               }
            } else {
               Network [FirstIndex][SecondIndex] = MAXCARD;
               SecondIndex++;
            }
         } while (SecondIndex <= NumberOfVirteces);
         FirstIndex++;
      } while (FirstIndex <= NumberOfVirteces);
   } else {
      FirstIndex = 1;
      do {
         SecondIndex = FirstIndex;
         do {
            if (FirstIndex != SecondIndex) {
               printf("Input distance from %s", Names [FirstIndex]);
               printf(" to %s: ", Names [SecondIndex]);
               gets (Answer);
               ch = Answer [0];
               if ((ch == 'b') || (ch == 'B') ||
                  ((ch != NULL) && (ch < ' '))) {
                  FirstIndex = NumberOfVirteces;
                  SecondIndex = FirstIndex + 1;
               }
               if (ch == NULL) {
                  printf("\nWARNING: Matrix will not be complete!");
                  Network [FirstIndex][SecondIndex] = MAXCARD;
                  Network [SecondIndex][FirstIndex] = MAXCARD;
                  SecondIndex++;
               } else {
                  if ((ch != 'd') && (ch != 'D'))
                     dist = (unsigned) atol (Answer);
                  if (dist > 0) {
                     Network [FirstIndex][SecondIndex] = dist;
                     Network [SecondIndex][FirstIndex] = dist;
                     SecondIndex++;
                  } else { 
                     if (ch == '-') {
                        if (--SecondIndex <= FirstIndex) {
                           if (FirstIndex > 1) {
                              FirstIndex--;
                              SecondIndex = NumberOfVirteces;
                           } else {
                              FirstIndex = 1;
                              SecondIndex = 2;
                           }
                        }
                     }
                  }
               }
            } else {
               Network [FirstIndex][SecondIndex] = MAXCARD;
               SecondIndex++;
            }
         } while (SecondIndex <= NumberOfVirteces);
         FirstIndex++;
      } while (FirstIndex <= NumberOfVirteces);
   }
   return (NumberOfVirteces);
} /* InputMatrix */


unsigned OutputMatrix (fp, Network, Names, NumberOfVirteces)
   FILE *fp;
   unsigned *Network[];
   char *Names[];
   unsigned NumberOfVirteces;
{   
   unsigned index, FirstIndex, SecondIndex;
   char *Answer;

   printf("%2u\n", NumberOfVirteces);
   for ( index = 1; index <=  NumberOfVirteces; index++)
      printf("%s\n", Names [index]);
   for ( FirstIndex = 1; FirstIndex <=  NumberOfVirteces; FirstIndex++)
      for ( SecondIndex = 1; SecondIndex <=  NumberOfVirteces; SecondIndex++)
         printf("%5u\n", Network [FirstIndex][SecondIndex]);
} /* OutputMatrix */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?