来源: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();
}
}