udebug 输出一模一样,可是就是WA
查看原帖
udebug 输出一模一样,可是就是WA
606649
josedelinux楼主2021/12/29 22:22

大佬帮看下555

/*
* UVa 227 - Puzzle
pretty nasty, i o shit
use 'fisrt' boolean variable to fit the format
*/
#include <stdio.h>
#include <string.h>
#define SWAP(a, b) ((a) ^= (b) ^= (a) ^= (b))
#define error "This puzzle has no final configuration."

int main() {
#ifdef DEBUG
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif

  int k = 1;
  int first = 1;
  /**
   * @brief
   * handle input
   */
  while (1) {
    int x = 0;
    int y = 0;

    char arr[6][6] = {0};
    char mvs[50] = {0};

    char ch = getchar();
    if (ch == '\n') ch = getchar();
    if (ch == 'Z')
      return 0;  // if  it's 'Z', quit
    else
      ungetc(ch, stdin);

    for (int i = 0; i < 5; i++) {
      scanf("%c%c%c%c%c\n", &arr[i][0], &arr[i][1], &arr[i][2], &arr[i][3],
            &arr[i][4]);
    }
    // replace \n with ' '
    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < 5; j++) {
        if (arr[i][j] == '\n') arr[i][j] = ' ';
      }
    }

    // sequence of moves
    /**
     * This sequence of moves may be spread
     * over several lines, but it always ends in the digit 0
     *
     * getline is way more easier
     * // getline(cin, mvs, '0');
     */
    char cmd;
    int ck = 0;  // cmd counts
    while ((cmd = getchar()) != EOF) {
      if (cmd == '\n') {
        cmd = getchar();
      }
      if (cmd == '0') {
        mvs[ck + 1] = '\0';
        break;
      }
      mvs[ck] = cmd;
      ck++;
    }

    /**
     * @brief
     * end of input
     */

    // buscarla
    for (int i = 0; i < 5; i++)
      for (int j = 0; j < 5; j++)
        if (arr[i][j] == ' ') {
          x = i;
          y = j;
        }

    // handle commands
    int flag = 0;  // is_end
    for (int i = 0; i < ck; i++) {
      switch (mvs[i]) {
        case 'A':
          if (x <= 0) {
            flag = 1;
            break;
          }
          SWAP(arr[x][y], arr[x - 1][y]);
          x--;
          break;
        case 'B':
          if (x >= 4) {
            flag = 1;
            break;
          }
          SWAP(arr[x][y], arr[x + 1][y]);
          x++;
          break;

        case 'R':
          if (y >= 4) {
            flag = 1;
            break;
          }
          SWAP(arr[x][y], arr[x][y + 1]);
          y++;
          break;

        case 'L':
          if (y <= 0) {
            flag = 1;
            break;
          }
          SWAP(arr[x][y], arr[x][y - 1]);
          y--;
          break;

        // unknown command
        default:
          flag = 1;
          break;
      }
    }

    if (!first) putchar('\n');
    if (first) first = 0;

    printf("Puzzle #%d:\n", k++);
#ifdef DEBUG
    // printf("cmds: %s\n", mvs);
#endif
    if (flag) {
      puts(error);
    } else {
      for (int i = 0; i < 5; i++) {
        printf("%c %c %c %c %c\n", arr[i][0], arr[i][1], arr[i][2], arr[i][3],
               arr[i][4]);
      }
    }
  }

  return 0;
}

2021/12/29 22:22
加载中...