
  /* follow solution path */

  if (NULL != solution_path) {
    for (len = 0; solution_path[len] != NULL; len++);
    printf("user Solution of length %d found!\n", len - 1);
    fflush(stdout);

    for (k = 1; k < len; k++) {
      /* Find the positions where the card left and appeared */
      S1 = solution_path[k-1];
      S2 = solution_path[k];

      loc1 = loc2 = -1;

      /* C trick: 'A' + 0 == 'A', 'A' + 1 == 'B', ..., 'A' + 3 == 'D' */
      for (i = 0; i < 4; i++) {
        if (S2->fcell[i] != S1->fcell[i]) {
          if (NULLCARD(S1->fcell[i])) loc2 = 'A' + i;
          else loc1 = 'A' + i;
        }
        if (S1->hcell[i] != S2->hcell[i])
          loc2 = 'H';
      }

      /* C trick: '1' + 0 == '1', '1' + 1 == '2', ..., '1' + 7 == '8' */
      for (i = 0; i < 8; i++)
        for (j = 0; j < 20; j++)
          if (S2->column[i][j] != S1->column[i][j])
            if (NULLCARD(S1->column[i][j])) loc2 = '1' + i;
            else loc1 = '1' + i;

      if (loc1 == -1 || loc2 == -1) {
        printf("user Error: No move found!\n");
        exit(1);
      }

      /* print move */
      printf("%c%c\n", loc1, loc2);
      fflush(stdout);

      /* read response to avoid deadlock */
      response = split_stdin(" ", &fields);
      free_split_stdin(response, fields);
    }
  }
  else {
    printf("user No solution found!\n");
  }
