poj 3414

题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。

      1.FILL(i):将ipot倒满水。

      2.DROP(i):将ipot倒空水。

      3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。

典型的最短求解问题 并记录路径
#include<iostream> #include<queue> using namespace std; bool v[111][111]; struct No { int a,b; int step; int prex,prey; }; struct Node { int step; int prex,prey; char a[15]; }map[111][111]; int a,b,c; void out(int x,int y) { if(map[x][y].prex==-1&&map[x][y].prey==-1) return ; out(map[x][y].prex,map[x][y].prey); cout<<map[x][y].a<<endl; } bool bfs() { queue<No>q; No now,next; now.a=0;now.b=0; now.step=0; now.prex=-1;now.prey=-1; memset(v,false,sizeof(v)); v[0][0]=true; q.push(now); map[0][0].prex=-1;map[0][0].prey=-1; map[0][0].step=0; while(!q.empty()) { now=q.front(); if(now.a==c||now.b==c) { cout<<now.step<<endl; out(now.a,now.b); return true; } q.pop(); //1填满 if(now.a<a&&(!v[a][now.b]||map[a][now.b].step>now.step+1)) { v[a][now.b]=1; next=now; next.a=a; next.step++; next.prex=now.a; next.prey=now.b; char s[]="FILL(1)"; strcpy(map[next.a][next.b].a,s); map[next.a][next.b].step=now.step+1; map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; v[a][next.b]=true; q.push(next); } if(now.b<b&&(!v[now.a][b]||map[now.a][b].step>now.step+1)) { v[now.a][b]=1; next=now; next.b=b; next.step++; next.prex=now.a; next.prey=now.b; strcpy(map[next.a][next.b].a,"FILL(2)"); map[next.a][next.b].step=now.step+1; map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; v[next.a][next.b]=true; q.push(next); } // 清空 if(now.a!=0&&(!v[0][now.b]||map[0][now.b].step>now.step+1)) { v[0][now.b]=1; next=now; next.a=0; next.prex=now.a; next.prey=now.b; next.step++; strcpy(map[next.a][next.b].a,"DROP(1)"); map[next.a][next.b].step=now.step+1; map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; q.push(next); } if(now.b!=0&&(!v[now.a][0]||map[now.a][0].step>now.step+1)) { v[now.a][0]=1; next=now; next.b=0; next.prex=now.a; next.prey=now.b; next.step++; strcpy(map[next.a][next.b].a,"DROP(2)"); map[next.a][next.b].step=now.step+1; map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; q.push(next); } //从i到到j if(now.a!=0) { int aa,bb; int x=b-now.b;//需要到得量 if(x>=now.a) { aa=0;bb=now.b+now.a; } else { bb=b;aa=now.a-x; } if((!v[aa][bb]||map[aa][bb].step>now.step+1)) { next.a=aa;next.b=bb; next.prex=now.a;next.prey=now.b; next.step=now.step+1; map[aa][bb].step=now.step+1; strcpy(map[aa][bb].a,"POUR(1,2)"); map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; v[next.a][next.b]=1; q.push(next); } } if(now.b!=0)//b->a { int aa,bb; int x=a-now.a;//需要到得量 if(x>=now.b) { aa=now.a+now.b; bb=0; } else { aa=a;bb=now.b-x; } if((!v[aa][bb]||map[aa][bb].step>now.step+1)) { next.a=aa;next.b=bb; next.prex=now.a;next.prey=now.b; next.step=now.step+1; map[aa][bb].step=now.step+1; strcpy(map[aa][bb].a,"POUR(2,1)"); map[next.a][next.b].prex=now.a; map[next.a][next.b].prey=now.b; v[next.a][next.b]=1; q.push(next); } } } return false; } int main() { while(cin>>a>>b>>c) { if(!bfs()) cout<<"impossible"<<endl; } return 0; }

 

转载于:https://www.cnblogs.com/zhangdashuai/p/4423208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值