POJ 1208 The Blocks Problem

来源:互联网 发布:java web接口开发demo 编辑:程序博客网 时间:2024/05/16 18:58

该题重点是要理解四种指令具体执行的操作,然后模拟操作执行过程。

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


原创粉丝点击