BFS—POJ3414-Pots
来源:互联网 发布:买家可以开通淘宝客吗 编辑:程序博客网 时间:2024/05/16 19:28
较原文有两处改动:1)以二维数组代替map,更简洁有效 2)输出操作过程,改进后更容易理解(原文好像也是对的,但是说不通)
原文地址POJ3414-Pots
#include<iostream>#include<string>#include<memory.h>using namespace std;int v1,v2; //两个瓶子的容量int c; //目标残余水量bool vist[101][101];int k1,k2; //在某状态时两个瓶子的剩余水量,temporarytypedef class{public:int x,y; //当前状态(两个瓶子中的水量)int pos; //记录前一状态在队列queue中的下标int step; //当前步数}process;void fill(int i){switch(i){ case 1: {k1=v1; return;}case 2: {k2=v2; return;}}}void drop(int i){switch(i){ case 1: {k1=0; return;}case 2: {k2=0; return;}}}void pour(int i,int j){switch(i){ case 1: // v1 to v2{if(k1+k2<=v2){k2=k1+k2;k1=0;}else{k1=k1+k2-v2;k2=v2;}return;}case 2: // v2 to v1{if(k1+k2<=v1){k1=k1+k2;k2=0;}else{k2=k1+k2-v1;k1=v1;}return;}}}void BFS(void){int operation[1000]={0}; //当前步的操作: 1z0:清空z瓶子 2z0:装满z瓶子 3xy:从x瓶倒向y瓶process queue[1000]; //状态队列int head,tail;queue[head=0].x=0;queue[tail=0].y=0;queue[tail++].step=0;while(head<tail){process p=queue[head];if(p.x==c || p.y==c) //得到要求的剩余水量c{cout<<p.step<<endl;/*下标回溯,输出操作过程*/int ps=p.step;int* steps=new int[ps+1]; //从1到p.step顺序记录各步操作的下标,不使用steps[0]steps[ps--]=head;while(ps){steps[ps]=queue[ steps[ps+1] ].pos;ps--;}for(int i=1;i<=p.step;i++){int temp=operation[ steps[i] ]; //注意各个数组间的下标关系switch(temp/100){ case 1:{cout<<"DROP("<<(temp/10)%10<<')'<<endl;break;}case 2:{cout<<"FILL("<<(temp/10)%10<<')'<<endl;break;}case 3:{cout<<"POUR("<<(temp/10)%10<<','<<temp%10<<')'<<endl;break;}}}delete steps;return;}/*装满v1*/k1=p.x;k2=p.y;fill(1);if(!vist[k1][k2]){vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1; //当前的操作步数queue[tail].pos=head; //前一步操作在queue[]中的下标operation[tail++]=210; //当前的操作}/*装满v2*/k1=p.x;k2=p.y;fill(2);if(!vist[k1][k2]){vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1;queue[tail].pos=head;operation[tail++]=220;}/*清空v1*/k1=p.x;k2=p.y;drop(1);if(!vist[k1][k2]){vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1;queue[tail].pos=head;operation[tail++]=110;}/*清空v2*/k1=p.x;k2=p.y;drop(2);if(!vist[k1][k2]){vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1;queue[tail].pos=head;operation[tail++]=120;}/*v1倒向v2*/k1=p.x;k2=p.y;pour(1,2);if(!vist[k1][k2]){vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1;queue[tail].pos=head;operation[tail++]=312;}/*v2倒向v1*/k1=p.x;k2=p.y;pour(2,1);if(!vist[k1][k2]){ vist[k1][k2]=true;queue[tail].x=k1;queue[tail].y=k2;queue[tail].step=p.step+1;queue[tail].pos=head;operation[tail++]=321;}head++;}cout<<"impossible"<<endl;return;}int main(void){while(cin>>v1>>v2>>c){memset(vist,false,sizeof(vist));BFS(); }return 0;}
0 0
- BFS—POJ3414-Pots
- poj3414——Pots(BFS)
- POJ3414 Pots —— BFS + 模拟
- POJ3414 Pots(BFS)
- poj3414 Pots(BFS)
- POJ3414 Pots BFS
- POJ3414 Pots(BFS)
- poj3414 Pots BFS
- 【POJ3414】Pots(BFS)
- poj3414 Pots(bfs)
- poj3414--Pots(bfs,记录路径)
- poj3414——Pots
- POJ3414——Pots
- poj3414——Pots
- POJ3414 Pots
- poj3414 Pots
- poj3414 Pots
- poj3414 - Pots
- GMM
- MySQL基础入门之增删改
- 回文素数
- java你画我猜(一)
- poj1703 题解
- BFS—POJ3414-Pots
- 怎样理解知识就是力量?
- 加法算式
- 黑马程序员--C语言基础-几个常用函数
- ios学习杂记一
- Windows7+VS2012下配置MPI环境
- 平方求和
- C++ string类应用
- PHPStorm8安裝及Xdebug配置筆記