POJ - 3414 Pots 搜索+分类讨论

题目简述

两个体积分别是a和b的水壶,通过执行以下步骤来在最短的时间内使其中一个水壶体积为c。

1.FILL(i) 把第i个水壶装满水

2.DROP(i) 把第i个水壶的水倒掉

3.POUR(i,j) 将第i个水壶的水倒到第j个水壶,可能会出现倒满或倒不满的情况。

输入

Cmax(A,B)100

题解

HDU-1495的拓展弱化版,没刷过这类题型的可以先做这道。

对上述三种步骤进行分类讨论,其中第三种情况分为倒满和倒不满两种状态。将状态跑一遍bfs就行。

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define N 105
struct node{
	int a,b;
	int ans;
	string s;
};
int a,b,c;
bool vis[N][N];
string str[10] = {"", "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)","POUR(2,1)"};
void bfs(){
	queue<node> q;
	node n1;
	n1.a=0;n1.b=0;n1.ans=0;n1.s="";
	q.push(n1);
	while(!q.empty()){
		node n1=q.front();q.pop();
		node n2;
		if(n1.a==c||n1.b==c){
			printf("%d\n",n1.ans);
			string s;
			for(int i=0;i<n1.s.size();i++){
				s+=n1.s[i];
				if(n1.s[i]==')'){
					cout<<s<<endl;
					s="";
				} 
			}
			return;
		}
		if(n1.a){
			if(n1.a>b-n1.b){
				n2.a=n1.a-(b-n1.b);
				n2.b=b;
				n2.ans=n1.ans+1;
				n2.s=n1.s+str[5];
			}
			else{
				n2.a=0;
				n2.b=n1.a+n1.b;
				n2.ans=n1.ans+1;
				n2.s=n1.s+str[5];
			}
			if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
		}
		if(n1.a){
			n2.a=0;n2.b=n1.b;n2.ans=n1.ans+1;n2.s=n1.s+str[3];
			if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
		}
		n2.a=a;n2.b=n1.b;n2.ans=n1.ans+1;n2.s=n1.s+str[1];
		if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
		if(n1.b){
			if(n1.b>a-n1.a){
				n2.b=n1.b-(a-n1.a);
				n2.a=a;
				n2.ans=n1.ans+1;
				n2.s=n1.s+str[6];
			}
			else{
				n2.a=n1.a+n1.b;
				n2.b=0;
				n2.ans=n1.ans+1;
				n2.s=n1.s+str[6]; 
			}
			if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
		}
		if(n1.b){
			n2.b=0;n2.a=n1.a;n2.ans=n1.ans+1;n2.s=n1.s+str[4];
			if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
		}
		n2.b=b;n2.a=n1.a;n2.ans=n1.ans+1;n2.s=n1.s+str[2];
		if(!vis[n2.a][n2.b]){
				vis[n2.a][n2.b]=1;
				q.push(n2);
			}
	}
	puts("impossible");
	return;
}
int ip(){
	int x=0,w=0;char ch=0;
	while(!isdigit(ch)) w|=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return w?-x:x;
}
int main(){
	a=ip(),b=ip(),c=ip();
	bfs();
	return 0;
} 
posted @   SxtoxA  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
12 13
点击右上角即可分享
微信分享提示