UVA 101 (暑期-线性表-D-The Blocks Problem)

来源:互联网 发布:mac向上箭头怎么打 编辑:程序博客网 时间:2024/06/11 14:24
#include <cstdio>int main() {int n;//block[30][30][1] 最多有 25 堆, 每堆最多有 25 个, 每个有个数字//block[i][29][0] 存放每堆个数//block[i][28][0] 存放数字移动后,在第几堆//block[i][27][0] 存放数字移动后,在第几个int block[30][30][1];scanf("%d", &n);for (int i = 0; i < n; i++) {block[i][0][0] = i;block[i][29][0] = 1;block[i][28][0] = i;block[i][27][0] = 0;}int num_1, num_2;char str_1[10], str_2[10];while (scanf("%s", str_1) && str_1[0] != 'q') {scanf("%d%s%d", &num_1, str_2, &num_2);//如果 a 和 b 在同一个堆,不操作if (block[num_1][28][0] == block[num_2][28][0])continue;//如果是 move 把 a 上面的元素归位if (str_1[0] == 'm') {int r = block[num_1][28][0];   // num_1 在所在堆的编号int s = block[num_1][27][0];  // num_1 在所在堆排第几int t = block[r][29][0];   // num_1 所在的堆有多少个元素 for (int i = t - 1; i > s; i--) {int j = block[r][i][0];  //num_1 所在堆最上面的那个元素的值int k = block[j][29][0];  //num_1 所在堆最上面的那个元素原位置的个数block[j][k][0] = j; //把最上面的那个元素归位到原来位置block[j][28][0] = j;//移动后所在的堆的编号block[j][27][0] = k;//移动后所在堆里面的第几个block[j][29][0]++; //num_1 所在堆最上面的那个元素原位置的个数加一block[r][29][0]--;   // num_1 所在的堆个数减一}}//如果是 onto 把 b 上面的元素归位if (str_2[1] == 'n') {int r = block[num_2][28][0];   // num_2 在所在堆的编号int s = block[num_2][27][0];   // num_2 在所在堆排第几int t = block[r][29][0];   // num_2 所在的堆有多少个元素 for (int i = t - 1; i > s; i--) {int j = block[r][i][0];  //num_2 所在堆最上面的那个元素的值int k = block[j][29][0];  //num_2 所在堆最上面的那个元素原位置的个数block[j][k][0] = j; //把最上面的那个元素归位到原来位置block[j][28][0] = j;block[j][27][0] = k;block[j][29][0]++; //num_2 所在堆最上面的那个元素原位置的个数加一block[r][29][0]--;   // num_2 所在的堆个数减一}}//把 a 元素上面的所有元素,  移动到 b 所在堆上面int r = block[num_1][28][0];   // num_1 在所在堆的编号int s = block[num_1][27][0];  // num_1 在所在堆在里面排第几int t = block[r][29][0];   // num_1 所在的堆有多少个元素 int r2 = block[num_2][28][0];   // num_2 在所在堆的编号for (int i = s; i < t; i++) {int j = block[r][i][0];  //num_1 所在堆将要被移动的那个元素的值int t2 = block[r2][29][0];   // num_2 所在的堆有多少个元素 block[r2][t2][0] = j;//把 a 上面的元素移到 b 所在堆上面block[j][28][0] = r2;block[j][27][0] = t2;block[r2][29][0]++;//num_2 所在堆个数加一block[r][29][0]--;//num_1 所在堆个数减一}}for (int i = 0; i < n; i++) {printf("%d:", i);for (int j = 0; j < block[i][29][0]; j++)printf(" %d",block[i][j][0]);printf("\n");}return 0;}

0 0
原创粉丝点击