codeup5999 巧妙取量

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/88139861

codeup5999 巧妙取量

时空限制    1000ms/128MB

题目描述

  有三个容器,容量分别为 a,b,c(a> b > c ),一开始a装满油,现在问是否只靠abc三个容器量出k升油。如果能就输出“yes”,并且说明最少倒几次,否则输出“no”。例如:10升油在10升的容器中,另有两个7升和3升的空容器,要求用这三个容器倒油,使得最后在abc三个容器中有一个刚好存有5升油,问最少的倒油次数是多少?(每次倒油,A容器倒到B容器,或者A内的油倒完,或者B容器倒满。
 10 7 3
(10 0 0)
(3 7 0):第一次
(3 4 3):第二次
(6 4 0):第三次
(6 1 3):第四次
(9 1 0):第五次
(9 0 1):第六次
(2 7 1):第七次
(2 5 3):第八次,出现5了。

Input

  有多组测试数据。
  输入a,b,c, k四个正整数( 100 ≥ a > b > c≥1 , 1≤k< 100 )

Output

  如果能得到k就输出两行。
  第一行“yes”,第二行为最少的次数
  否则输出“no”

Sample Input

10 7 3 5

Sample Output

yes

8

代码

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 105;
int a,b,c,k;
bool f[N][N][N];
struct node{
	int a,b,c,step;
	node(){	}
	node(int x,int y,int z,int s):a(x),b(y),c(z),step(s){ }
};

void bfs(){
	memset(f,0,sizeof(f));
	queue<node> q;
	q.push(node(a,0,0,0));
	f[a][b][c] = true;
	while (!q.empty()){
		node cur=q.front(); q.pop();
		if (cur.a==k || cur.b==k || cur.c==k){	//到达目标状态
			cout<<"yes\n"<<cur.step<<endl;
			return;
		}
		if (cur.a>0 && cur.b<b){	//a->b
			int t=min(cur.a,b-cur.b);
			if (!f[cur.a-t][cur.b+t][cur.c]){
				q.push(node(cur.a-t,cur.b+t,cur.c,cur.step+1));
				f[cur.a-t][cur.b+t][cur.c] = true;
			}
		}
		if (cur.a>0 && cur.c<c){	//a->c
			int t=min(cur.a,c-cur.c);
			if (!f[cur.a-t][cur.b][cur.c+t]){
				q.push(node(cur.a-t,cur.b,cur.c+t,cur.step+1));
				f[cur.a-t][cur.b][cur.c+t] = true;
			}
		}
		if (cur.b>0 && cur.a<a){	//b->a
			int t=min(cur.b,a-cur.a);
			if (!f[cur.a+t][cur.b-t][cur.c]){
				q.push(node(cur.a+t,cur.b-t,cur.c,cur.step+1));
				f[cur.a+t][cur.b-t][cur.c] = true;
			}
		}
		if (cur.b>0 && cur.c<c){	//b->c
			int t=min(cur.b,c-cur.c);
			if (!f[cur.a][cur.b-t][cur.c+t]){
				q.push(node(cur.a,cur.b-t,cur.c+t,cur.step+1));
				f[cur.a][cur.b-t][cur.c+t] = true;
			}
		}
		if (cur.c>0 && cur.a<a){	//c->a
			int t=min(cur.c,a-cur.a);
			if (!f[cur.a+t][cur.b][cur.c-t]){
				q.push(node(cur.a+t,cur.b,cur.c-t,cur.step+1));
				f[cur.a+t][cur.b][cur.c-t] = true;
			}
		}
		if (cur.c>0 && cur.b<b){	//c->b
			int t=min(cur.c,b-cur.b);
			if (!f[cur.a][cur.b+t][cur.c-t]){
				q.push(node(cur.a,cur.b+t,cur.c-t,cur.step+1));
				f[cur.a][cur.b+t][cur.c-t] = true;
			}
		}
	}
	cout<<"no\n";
}

int main(){
	while (cin>>a>>b>>c>>k) bfs();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WDAJSNHC/article/details/88139861
今日推荐