P2784 木块问题 本该用vector的.....

来源:互联网 发布:工业产品动画制作软件 编辑:程序博客网 时间:2024/05/26 05:51


【问题描述】  
  在计算机科学中的很多地方都会使用简单,抽象的方法来做分析和实验验究。比如在早期的规划学和机器人学的人工智能研究就利用一个积木世界,让机械臂执行操作积木的任务。 

  在这个问题中,你将在确定的规则和约束条件下构建一个简单的积木世界。这不是让你来研究怎样达到某种状态,而是编写一个“机械臂程序”来响应有限的命令集。 

  问题就是分析一系列的命令,告诉机械臂如何操纵放在一个平台上的积木。最初平台上有n个积木(编号由0到n-1),对于任意的0≤i< n-1,积木b[i]都与b[i+1]相邻,图示如下: 

     
          图:积木世界的初始状态 

  机械臂操作积木的有效指令列举如下: 

  1、move a onto b :先将a和b上面所有的积木都放回原处,再将a放在b上。

  2、move a over b :先将a上面所有的积木放回原处,再将a放在b上(b上原有积木不动)。

  3、pile a onto b :将a和其上面所有的积木组成的一摞整体移动到b上。在移动前要先将b上面所有的积木都放回原处。移动的一摞积木要保持原来的顺序不变。

  4、pile a over b :将a和其上面所有的积木组成的一摞整体移动到b所在一摞积木的最上面一个积木上。移动的一摞积木要保持原来的顺序不变。

  5、quit :结束积木世界的操纵。 

  当a = b或a和b处在同一摞时,任何企图操作a和b的命令都是非法的。所有非法的命令都要忽略,且不能对当前积木的状态产生作用。

这个是vector练习题   写vector写一半眼睛受不鸟  所以瞎写了个没用vector的...感觉直接瞎了....还好一交居然比杨大神老乡只慢个几毫秒,允许彩笔小小的骄傲一下...


其实还没有教链表,但是我觉得那一套思想 拿来做这个很管用的...分析一下,大概是只要首尾的状态即可,相当于木块首尾相连,那么就用结构体和类似链表的思路来搞他.... 结构体三个数据,木块的编号,木块上一个木块的编号,下一个的编号....每次操作对木块的上下编号变一下就可以了;输出的时候判断一下是不是已经被移走就可以;对于每个木块的上下块可以设置个初值,比如-23啥子的....好判断嘛


具体怎么个思路就不说了  反正仅仅存题用而已...我能看懂就行...


#include<cstdio>#include<cstring>using namespace std;int n,a,b,ne,la,flag;struct data{int num;int next;// n2int last;// n3};char play[6],way[6];data num[30];void back(int x){if((num[x].last==la&&num[x].next==ne)||x==ne) return; else if(num[x].next==ne){num[num[x].last].next=ne;    num[x].last=la;    return;}else{num[num[x].last].next=ne;//上一个数的 下一个数清空 num[x].last=la;//此数的上一个数清空,脱节 back(num[x].next);//运行下一个数    }}void link(int x,int y){if(num[y].next==ne){num[y].next=x;num[x].last=y;return;}link(x,num[y].next);}void print(int x){if(num[x].next==ne){printf("%d\n",x);return;}printf("%d ",x);print(num[x].next);}void check(int x,int y){if(num[x].next==ne) return;if(num[x].next==y){flag=1;return;}check(num[x].next,y);}int main(){    scanf("%d",&n);    ne=n+3,la=n+4;    for(int i=0;i<n;i++){    data t={i,ne,la};    num[i]=t;    }while(scanf("%s",play)==1)    {    if(play[0]=='q') break;    scanf("%d%s%d",&a,way,&b);    if(a==b) continue;    flag=0;check(b,a);if(flag==1) continue;check(a,b);if(flag==1) continue;    if(play[0]=='m')    {    if(way[1]=='n'){    back(num[b].next);    back(a);}if(way[1]=='v') back(a);link(a,b);}if(play[0]=='p'){if(way[1]=='n') back(num[b].next);num[num[a].last].next=ne;    num[a].last=la;link(a,b);}}for(int i=0;i<n;i++){printf("%d: ",i);if(num[i].last==la) print(i);else printf("\n");}return 0;}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

总结一下:

1,眼睛很重要

2,写函数如果要少写几个就要多打草稿或者打脑壳,反之脑补

3,活学活用???