UVA 101 - The Blocks Problem(模拟)
题目不难,就是有点麻烦。会用到栈。
#include <stdio.h>
#include <string.h>
struct _r {
int a[30];
int x;
}r[30];
int n;
// 判断a, b是否在同一堆中
int pos(int a) {
for (int i=0; i<n; i++) {
for (int j=0; j<r[i].x; j++) {
if (a == r[i].a[j])
return i;
}
}
}
int xab(int a) {
for (int i=0; i<n; i++) {
for (int j=0; j<r[i].x; j++) {
if (a == r[i].a[j])
return j;
}
}
}
void move_onto(int a, int b, int pa, int pb) {
// 下面两个for循环将a, b堆上面的元素返回原来位置
for (int i=r[pa].x-1; r[pa].a[i]!=a; i--) {
r[pa].x--;
r[r[pa].a[i]].x++;
}
for (int i=r[pb].x-1; r[pb].a[i]!=b; i--) {
r[pb].x--;
r[r[pb].a[i]].x++;
}
r[pb].a[r[pb].x] = r[pa].a[r[pa].x-1];
r[pb].x++;
r[pa].x--;
}
void move_over(int a, int b, int pa, int pb) {
for (int i=r[pa].x-1; r[pa].a[i]!=a; i--) {
r[pa].x--;
r[r[pa].a[i]].x++;
}
r[pb].a[r[pb].x] = r[pa].a[r[pa].x-1];
r[pb].x++;
r[pa].x--;
}
void pile_onto(int a, int b, int pa, int pb) {
// 将b上面的元素返回原来的位置
for (int i=r[pb].x-1; r[pb].a[i]!=b; i--) {
r[pb].x--;
r[r[pb].a[i]].x++;
}
// 将a上面的元素保持到临时栈中
int tmp_stack[30], top = 0;
do {
r[pa].x--;
tmp_stack[++top] = r[pa].a[r[pa].x];
} while (r[pa].a[r[pa].x] != a);
while (top) {
r[pb].a[r[pb].x] = tmp_stack[top];
top--;
r[pb].x++;
}
}
void pile_over(int a, int b, int pa, int pb) {
// 将a上面的元素保持到临时栈中
int tmp_stack[30], top = 0;
do {
r[pa].x--;
tmp_stack[++top] = r[pa].a[r[pa].x];
} while (r[pa].a[r[pa].x] != a);
while (top) {
r[pb].a[r[pb].x] = tmp_stack[top];
top--;
r[pb].x++;
}
}
void print() {
for (int i=0; i<n; i++) {
printf("%d:", i);
for (int j=0; j<r[i].x; j++)
printf(" %d", r[i].a[j]);
printf("\n");
}
}
int main() {
char str1[6], str2[6];
scanf("%d", &n);
for (int i=0; i<n; i++) {
r[i].x = 1;
r[i].a[0] = i;
}
while (scanf("%s", str1)) {
if (0 == strcmp(str1, "quit"))
break;
int a, b;
scanf("%d%s%d", &a, str2, &b);
int pa, pb; // a, b所在哪个堆
pa = pos(a); pb = pos(b);
if (pa == pb)
continue;
if (0==strcmp(str1, "move") && 0==strcmp(str2, "onto")) {
move_onto(a, b, pa, pb);
}
if (0==strcmp(str1, "move") && 0==strcmp(str2, "over")) {
move_over(a, b, pa, pb);
}
if (0==strcmp(str1, "pile") && 0==strcmp(str2, "onto")) {
pile_onto(a, b, pa, pb);
}
if (0==strcmp(str1, "pile") && 0==strcmp(str2, "over")) {
pile_over(a, b, pa, pb);
}
//print();
}
print();
return 0;
}

浙公网安备 33010602011771号