该题重点是要理解四种指令具体执行的操作,然后模拟操作执行过程。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct block
{
int num;
struct block *up, *down; //分别指向该block上面和下面的block
} block;
block *table[25]; //模拟桌子
block *point[25]; //point[i]始终指向对应的block,方便找到指定的block
int n; //block的数量
void init() //初始化
{
block *p;
for(int i=0; i<n; i++)
{
p=(block*)malloc(sizeof(block));
p->num=i;
p->up = p->down = NULL;
table[i] = point[i]= p;
}
}
//判断指令是否合法
bool isValid(int a, int b)
{
block *p;
if(a==b) return false;
//从a往上搜索
p=point[a]->up;
while(p)
{
if(p->num == b) return false;
p=p->up;
}
//从a往下搜索
p=point[a]->down;
while(p)
{
if(p->num == b) return false;
p=p->down;
}
return true;
}
//将b及b以上的block放到初始位置
void recover(block *b)
{
while(b)
{
b->down->up=NULL;
b->down=NULL;
table[b->num]=b;
b=b->up;
}
}
void output()
{
block *p;
for(int i=0; i<n; ++i)
{
cout<<i<<":";
p=table[i];
while(p)
{
cout<<" "<<p->num;
p=p->up;
}
cout<<endl;
}
}
int main()
{
int a,b;
string str1, str2;
block *p_a, *p_b;
cin>>n;
init();
cin>>str1;
while(str1 != "quit")
{
cin>>a>>str2>>b;
if(isValid(a,b))
{
p_a = point[a];
p_b = point[b];
//进行相应的操作
if(str1 == "move")
{
if(p_a -> up) recover(p_a -> up);
}
if(str2 == "onto")
{
if(p_b -> up) recover(p_b -> up);
}
else
{
while(p_b->up) p_b = p_b->up;
}
//将a与下面的block断开
if(p_a->down)
{
p_a->down->up=NULL;
p_a->down=NULL;
}
else
{
table[p_a->num]=NULL;
}
//将a放到blockb上
p_b->up=p_a;
p_a->down=p_b;
}
cin>>str1;
}
output();
return 0;
}