BFS 模板(倒水问题)
作者:
longlongAC
,
2020-10-01 00:03:53
,
所有人可见
,
阅读 632
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,d[360][5] ,bz[4][8][11],man[4]={0,3,7,10};
//d代表节点,bz标注状态数组 man 杯子满水的情况
scanf("%d",&t);//第三个杯子 目标水量
memset(d,0,sizeof(d));
memset(bz,0,sizeof(bz));
//状态初始化
d[1][1] = 0;
d[1][2] = 0;
d[1][3] = 10;
d[1][4] = 0;
//标注第一种状态
bz[0][0][10] =1;
int i=0,j=1;
while(i<j)
{
i++;
for(int p=1;p<=3;p++)//倒出水的杯子
for(int q=1;q<=3;q++)//倒入水的杯子
if(p!=q && d[i][p]>=0 && d[i][q]<=man[q])
{
j++;
for(int k=1;k<=4;k++) d[j][k] = d[i][k];
if(d[j][p]+d[j][q]<=man[q]) //倒出杯的水加上倒入杯的水小于满杯
{//把自己倒空
d[j][q] = d[j][q]+d[j][p];
d[j][p] = 0;
}
else
{//把对方倒满
d[j][p] = d[j][p] - (man[q] - d[j][q]);
d[j][q] = man[q];
}
if(bz[d[j][1]][d[j][2]][d[j][3]] == 0)
{
bz[d[j][1]][d[j][2]][d[j][3]] = 1;
d[j][4]++;
if(d[j][3] == t)
{
printf("%d",d[j][4]);
return 0;
}
}
else j--;
}
}
printf("%d",-1);
return 0;
}