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;}