engine.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:1k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* hanoi solver for hanoi2 */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. #include <unistd.h>
  6. static int num_disks[3] =
  7. {0, 0, 0};
  8. static void
  9. move_disk(int from, int to, int fd)
  10. {
  11.   char buf[3];
  12.   assert(from != to);
  13.   num_disks[from]--;
  14.   num_disks[to]++;
  15. #ifdef TEST_ENGINE
  16.   printf("%d --> %dn", from, to);
  17. #else
  18.   buf[0] = 'M';
  19.   buf[1] = (char) from;
  20.   buf[2] = (char) to;
  21.   if (3 != write(fd, buf, 3)) {
  22.     perror("can't write");
  23.     exit(1);
  24.   }
  25. #endif
  26. }
  27. static void
  28. move_disks(int from, int to, int n, int fd)
  29. {
  30.   static int other_table[9] =
  31.   {-1, 2, 1, 2, -1, 0, 1, 0, -1};
  32.   int other;
  33.   assert(from != to);
  34.   other = other_table[from * 3 + to];
  35.   assert(other != -1);
  36.   if (n == 1) {
  37.     move_disk(from, to, fd);
  38.   } else {
  39.     move_disks(from, other, n - 1, fd);
  40.     move_disk(from, to, fd);
  41.     move_disks(other, to, n - 1, fd);
  42.   }
  43. }
  44. void
  45. engine(int *args)
  46. {
  47.   num_disks[0] = args[0];
  48.   for (;;) {
  49.     move_disks(0, 2, args[0], args[1]);
  50.     move_disks(2, 0, args[0], args[1]);
  51.   }
  52. }
  53. #ifdef TEST_ENGINE
  54. int
  55. main(int argc, char *argv[])
  56. {
  57.   int engine_args[2];
  58.   if (argc > 1) {
  59.     engine_args[0] = atoi(argv[1]);
  60.   }
  61.   engine_args[1] = 1;
  62.   engine(n, engine_args);
  63.   return 0;             /* ANSI C requires main to return int. */
  64. }
  65. #endif