非常可乐_BFS

来源:HDU_C语言0基础

第一次使用bfs,看一遍,抄一遍。。。自己再去打一遍代码,收获其实还是很大的。

倒水问题,把问题细化,就是a->b,a->c,b->a.....之类的问题,再用上bfs,那就把复杂问题简单化了,其中思想类似于枚举。

精华部分:

void bfs()
{
	queue<A>Q;
	memset(visted,0,sizeof(visted));
	f.cup[1]=cup[1];f.cup [2]=0;f.cup[3]=0;f.step =0;
	Q.push(f);
	visted[cup[1]][0][0]=1;
	while(!Q.empty())
	{
	   f=Q.front();Q.pop();

	   if(f.cup[1]==f.cup [2]&&f.cup[3]==0){
	   	cout<<f.step<<endl;
	   	return;
	   }
	   for(i=1;i<4;i++)
	   {
	   	for(j=1;j<4;j++){
	   		if(i==j){
	   			continue;
			   }
	   		t=f;
	   		pour(i,j);
	   		if(!visted[t.cup[1]][t.cup[2]][t.cup[3]])
	   		{
	   			visted[t.cup[1]][t.cup[2]][t.cup[3]]=1;
	   			t.step++;
	   			Q.push(t);
			   }
		   }
	   }
	}
	cout<<"NO"<<endl;
}

全部代码:
 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int cup[4];
int visted[102][102][102];
int i,j;
struct A{
	int cup[4],step;
};
struct A f,t;
void pour(int a,int b)
{
	int sum=t.cup[a]+t.cup[b];
	if(cup[b]>sum){
		t.cup[b]=sum;
	}else{
		t.cup[b]=cup[b];
	}
	t.cup[a]=sum-t.cup[b];
}
void bfs()
{
	queue<A>Q;
	memset(visted,0,sizeof(visted));
	f.cup[1]=cup[1];f.cup [2]=0;f.cup[3]=0;f.step =0;
	Q.push(f);
	visted[cup[1]][0][0]=1;
	while(!Q.empty())
	{
	   f=Q.front();Q.pop();

	   if(f.cup[1]==f.cup [2]&&f.cup[3]==0){
	   	cout<<f.step<<endl;
	   	return;
	   }
	   for(i=1;i<4;i++)
	   {
	   	for(j=1;j<4;j++){
	   		if(i==j){
	   			continue;
			   }
	   		t=f;
	   		pour(i,j);
	   		if(!visted[t.cup[1]][t.cup[2]][t.cup[3]])
	   		{
	   			visted[t.cup[1]][t.cup[2]][t.cup[3]]=1;
	   			t.step++;
	   			Q.push(t);
			   }
		   }
	   }
	}
	cout<<"NO"<<endl;
}
int main()
{
	while(cin>>cup[1]>>cup[2]>>cup[3]&&(cup[1]!=0||cup[2]!=0||cup[3]!=0))
	{
		if(cup[1]%2==1){
			cout<<"NO"<<endl;
			continue;
		}
		if(cup[2]<cup[3])
		{
			int t=cup[2];
			cup[2]=cup[3];
			cup[3]=t;
		}
		bfs();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值