POJ-1208

来源:互联网 发布:服务器网络不稳定 编辑:程序博客网 时间:2024/06/06 01:57
#include <stdio.h>#include<string.h>#define MAX 25int stack[MAX][MAX+1];int block[MAX];int move_out(int num){    int i;    for (i = stack[block[num]][MAX]; stack[block[num]][i] != num; i--) {         stack[stack[block[num]][i]][++stack[stack[block[num]][i]][MAX]] = stack[block[num]][i];         block[stack[block[num]][i]] = stack[block[num]][i];         stack[block[num]][i] = -1;         stack[block[num]][MAX]--;    }    return i;}void move(int a, int b, int model){     int i;     //  将a上的积木放回原来的地方      i = move_out(a);     // 将a从堆中移除      stack[block[a]][i] = -1;     stack[block[a]][MAX]--;     // 如果是onto模式      if (!model) {        // 将b上的积木放回原来的地方         i = move_out(b);     }      // 将a移到b上     stack[block[b]][++stack[block[b]][MAX]] = a;     // 将a的新位置保存     block[a] =  block[b];}void pile(int a, int b, int model){     int i, where; where = block[a]; // 如果是onto模式  if (!model) {        // 将b上的积木放回原来的地方         i = move_out(b);     }     // 找到a在堆的什么位置     for (i = 0; stack[where][i] != a; i++)         ;     stack[where][MAX] = i-1;     // 将a和a上面的所有积木搬到b上      for (; stack[where][i] != -1; i++) {         stack[block[b]][++stack[block[b]][MAX]] = stack[where][i];         // 将stack[block[a]][i]的新位置保存         block[stack[where][i]] =  block[b];         stack[where][i] = -1;     }}int main(){    int n, a, b, i, j;    int modle;    char command1[5], command2[5];    // 初始化 stack数组 和 block数组     for (i = 0; i < MAX; i++) {        stack[i][0] = i;        for (j = 1; j < MAX; j++)            stack[i][j] = -1;        stack[i][MAX] = 0;        block[i] = i;    }    scanf("%d", &n);    scanf("%s%d%s%d", command1, &a, command2, &b);    while (strcmp(command1, "quit")) {          //若a=b,或者a, b在同一堆中,该动作不合法,不做改变          if (block[a] != block[b]) {              if (!strcmp(command1, "move"))                 modle = 0;              else                  modle = 2;              if (!strcmp(command2, "onto"))                 modle += 1;              else                  modle += 2;              switch (modle) {                     case 1 : move(a, b, 0); break;                     case 2 : move(a, b, 1); break;                     case 3 : pile(a, b, 0); break;                     case 4 : pile(a, b, 1); break;              }          }          scanf("%s%d%s%d", command1, &a, command2, &b);    }    for (i = 0; i < n; i++) {        printf("%d:", i);        for (j = 0; stack[i][j] != -1; j++)            printf(" %d", stack[i][j]);        printf("\n");    }    return 0;}