Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
幼稚代码献上(BFS)//一不小心AC了...这道题目挺好玩的哈 BFS //2个瓶子倒水,一共有6种倒法,枚举即可,但相同出现的状态不要重复出现 //并且还要记住上一次的操作。。。 //因为是special judge,所以我觉得DFS也可以吧? #include<iostream> using namespace std; bool visit[110][110];//标记某种状态是否已经出现过 struct node { int x;//A瓶的剩余量 int y;//B瓶的剩余量 int pre;//上一次操作的ID值 int step;//走到这一步时候的步骤数目 int op;//操作的类型:从1到6 }; node q[100000],temp,tt;//队列 int rear,front,x,y,step,ID,xx,yy; int m,n,rest; void show(int pre)//递归输出结果 { if(pre==-1)//直接返回,不必输出 return ; show(q[pre].pre); if(q[pre].op==1) { printf("FILL(1)\n"); return ; } if(q[pre].op==2) { printf("FILL(2)\n"); return ; } if(q[pre].op==3) { printf("DROP(1)\n"); return ; } if(q[pre].op==4) { printf("DROP(2)\n"); return ; } if(q[pre].op==5) { printf("POUR(1,2)\n"); return ; } if(q[pre].op==6) { printf("POUR(2,1)\n"); return ; } } void process()//BFS函数 { int i; visit[0][0]=1; temp.pre=-1; temp.step=0; temp.x=0; temp.y=0; q[rear++]=temp;//初始化 while(front!=rear)//队列为空,退出 { tt=q[front++]; x=tt.x; step=tt.step; y=tt.y; if(x==rest||y==rest)//找到一个最快的结果 { printf("%d\n",step); show(front-1); return ; } for(i=1;i<=6;i++) { if(i==1) { xx=m; yy=y; if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } if(i==2) { xx=x; yy=n; if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } if(i==3) { xx=0; yy=y; if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } if(i==4) { xx=x; yy=0; if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } if(i==5) { if(x>n-y) { xx=x-n+y; yy=n; } else { xx=0; yy=y+x; } if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } if(i==6) { if(y>m-x) { xx=m; yy=y-m+x; } else { xx=x+y; yy=0; } if(!visit[xx][yy]) { q[rear].x=xx; q[rear].y=yy; q[rear].op=i; q[rear].step=step+1; q[rear++].pre=front-1; visit[xx][yy]=1; } continue; } } } printf("impossible\n"); } int main() { scanf("%d%d%d",&m,&n,&rest); process(); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator