这些题目都有一个共同点就是题目不容易看懂,对我们这些英语水的童鞋可是一个很大的挑战啊。。好了不废话,上题目:
Uva101 - The Blocks Problem 此题最大的挑战就是难懂,这里综合一下别人的翻译。操作就是
分析了一下也不是很难,就动手写了。用了一个结构体保存每一个积木上面有的积木数量m和积木的编号。对其进行操作,结果吧移动想的简单了。后面看了别人写的,才搞懂。花了好长时间。这里贴代码:
#include <stdio.h> #include <string.h> struct node { int num,block[30]; }a[30]; int postion[30]; void turnback(int x) { int i,j,pos,t=postion[x],T,s=0; for (i=1;i<=a[t].num;i++) if (a[t].block[i]==x) {pos=i;break;} for (i=pos+1;i<=a[t].num;i++) { T=a[t].block[i]; ++a[T].num; ++s; for (j=a[T].num;j>=2;j--) a[T].block[j]=a[T].block[j-1]; a[T].block[1]=T; postion[T]=T; } a[t].num=a[t].num-s; } void move1(int x,int y) { int i,pos,t=postion[x],T=postion[y]; ++a[T].num; a[T].block[a[T].num]=x; for (i=1;i<=a[t].num;i++) if (a[t].block[i]==x) {pos=i;break;} for (i=pos;i<a[t].num;i++) a[t].block[i]=a[t].block[i+1]; --a[t].num; postion[x]=postion[y]; } void move2(int x,int y) { int i,pos,t=postion[x],T=postion[y],s=0; for (i=1;i<=a[t].num;i++) if (a[t].block[i]==x) {pos=i;break;} for (i=pos;i<=a[t].num;i++) { ++a[T].num; ++s; a[T].block[a[T].num]=a[t].block[i]; postion[a[t].block[i]]=T; } a[t].num=a[t].num-s; } int main() { char s[30],s1[30]; int i,j,n,x,y; while (scanf("%d",&n)!=EOF) { for (i=0;i<n;i++) {a[i].num=1; a[i].block[1]=i; postion[i]=i; } while (scanf("%s",&s)) { if (strcmp(s,"quit")==0) break; scanf("%d%s%d",&x,&s1,&y); if ((postion[x]!=postion[y])&&(x!=y)) { if ((strcmp(s,"move")==0)&&(strcmp(s1,"onto")==0)) {turnback(x); turnback(y); move1(x,y);} if ((strcmp(s,"move")==0)&&(strcmp(s1,"over")==0)) {turnback(x); move1(x,y);} if ((strcmp(s,"pile")==0)&&(strcmp(s1,"onto")==0)) {turnback(y); move2(x,y);} if ((strcmp(s,"pile")==0)&&(strcmp(s1,"over")==0)) {move2(x,y);} } } for (i=0;i<n;i++) { printf("%d:",i); for (j=1;j<=a[i].num;j++) printf(" %d",a[i].block[j]); printf("\n"); } } return 0; }