码迷,mamicode.com
首页 > 其他好文 > 详细

poj 3414

时间:2015-04-13 22:34:28      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出两个容积分别为 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; }

 

poj 3414

标签:

原文地址:http://www.cnblogs.com/zhangdashuai/p/4423208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!