题目不难,模拟类的问题,用C语言写的。
有些细节要注意,比如各种非法命令如何处理,题目中有明确说明:
Any command in which a = b or in which a and b are in the same stack of blocks is an illegal command. All illegal commands should be ignored and should have no affect on the configuration of blocks
还有貌似我用ANSI C提交不支持 // 注释,会导致编译错误。
#include<stdio.h>
#include<string.h>
#define MAX 30
struct Stack {
int element[MAX];
int size;
};
struct Pile {
struct Stack stacks[MAX];
int size;
};
typedef struct Index {
int i;
int j;
} Index;
struct Pile pile;
void printPile() {
int i, j;
for (i = 0; i < pile.size; i++) {
printf("%d:", i);
for (j = 0; j < pile.stacks[i].size; j++) {
printf(" %d", pile.stacks[i].element[j]);
}
printf("\n");
}
}
void getIndex(int BlockNum, Index* index) {
int i, j;
for (i = 0; i < pile.size; i++) {
for (j = 0; j < pile.stacks[i].size; j++) {
if (BlockNum == pile.stacks[i].element[j]) {
index->i = i;
index->j = j;
break;
}
}
}
}
void move(Index from, Index to) {
pile.stacks[to.i].element[to.j] = pile.stacks[from.i].element[from.j];
pile.stacks[to.i].size++;
pile.stacks[from.i].size--;
}
/*
* type is 0 when move/pile "onto" sth.
* type is not 0 when move/pile "over" sth.
* */
void moveNum(int fromInt, int toInt, int type) {
Index from, to;
getIndex(fromInt, &from);
getIndex(toInt, &to);
if (type == 0)
to.j++;
else
to.j = pile.stacks[to.i].size;
move(from, to);
}
void multiMove(Index from, Index to) {
int i;
int end = pile.stacks[from.i].size;
for (i = from.j; i < end; i++) {
Index tmpFrom = { from.i, i };
Index tmpTo = { to.i, pile.stacks[to.i].size };
move(tmpFrom, tmpTo);
}
}
void multiMoveNum(int fromInt, int toInt) {
Index from, to;
getIndex(fromInt, &from);
getIndex(toInt, &to);
multiMove(from, to);
}
void returnBlocks(Index index) {
int i, value;
int size = pile.stacks[index.i].size;
for (i = index.j + 1; i < size; i++) {
value = pile.stacks[index.i].element[i];
Index from = { index.i, i };
Index to = { value, pile.stacks[value].size };
move(from, to);
}
}
void returnNum(int blockNum) {
Index index;
getIndex(blockNum, &index);
returnBlocks(index);
}
int main() {
int n;
int i;
while (scanf("%d", &n) != EOF) {
pile.size = n;
for (i = 0; i < pile.size; i++) {
pile.stacks[i].element[0] = i;
pile.stacks[i].size = 1;
}
char cmd1[10],cmd2[10];
int fromInt,toInt;
while(1) {
scanf("%s",cmd1);
if(strcmp(cmd1,"quit")==0) {
printPile();
break;
}
scanf("%d%s%d",&fromInt,cmd2,&toInt);
if(fromInt==toInt)
continue;
Index from,to;
getIndex(fromInt,&from);
getIndex(toInt,&to);
if(from.i==to.i)
continue;
if(strcmp(cmd1,"move")==0) {
if(strcmp(cmd2,"onto")==0) {
returnNum(fromInt);
returnNum(toInt);
moveNum(fromInt, toInt,0);
}
else {
returnNum(fromInt);
moveNum(fromInt, toInt,1);
}
}
else {
if(strcmp(cmd2,"onto")==0) {
returnNum(toInt);
multiMoveNum(fromInt,toInt);
}
else {
multiMoveNum(fromInt,toInt);
}
}
}
}
return 0;
}