貌似uva崩了,现在进不去,所以这道题还判断正确与否,其实无所谓了,我这是看的网上的代码,写的基本上一样,唉,没办法,不会做,又看了网上的题解,认真写理解吧还是。。。
构造了一个结构体,water数组用来保存三个杯子的状态,sum用来保存当前的倒水量,visit数组用来保存状态,以
防他们重复访问,三个杯子只需要两个杯子来判断,第三个已经确定,所以开一个二维数组就可以了。。。然后用
reach数组来存储所有的倒水量,下标是目标水量,值是一共的倒水量。。。
只需要一次BFS最多有200*200种状态,然后从这些状态中找到想要求的目标水量对应的到水量就可以了。。。
二维数组来判断是否重复是个好方法,只可惜我没想出来,。。。。继续加油!!!
另外还出了点bug,找了一上午。。。原来是优先级问题,if语句里面的,以后都老老实实加括号算了。。。
代码:
<span style="font-family:Courier New;font-size:18px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int visit[205][205];
int reach[205];
int a[3];
struct state
{
int water[3];
int sum;
}stt,st2;
void solve()
{
for(int k=0; k<3; k++)
{
if(reach[st2.water[k]] == -1)
reach[st2.water[k]] = st2.sum;
else if(reach[st2.water[k]] > st2.sum)
reach[st2.water[k]] = st2.sum;
}
return ;
}
void bfs()
{
state st1;
int i,j;
st1.water[0] = 0;
st1.water[1] = 0;
st1.water[2] = a[2];
st1.sum = 0;
reach[0] = reach[a[2]] = 0;
visit[0][0] = 1;
queue<state>que;
que.push(st1);
while(!que.empty())
{
stt = que.front();
que.pop();
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
if(i == j)
continue;
st2 = stt;
int m = a[j] - stt.water[j] > stt.water[i] ? stt.water[i] : a[j] - stt.water[j];
st2.water[i] = stt.water[i] - m;
st2.water[j] = stt.water[j] + m;
if(!visit[st2.water[0]][st2.water[1]] || reach[st2.water[0]] > (stt.sum + m) || reach[st2.water[1]] > (stt.sum +m )|| reach[st2.water[2]] >(stt.sum +m))
{
visit[st2.water[0]][st2.water[1]] = 1;
st2.sum = stt.sum + m;
solve();
que.push(st2);
}
}
}
}
return ;
}
int main()
{
int T,ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&a[0],&a[1],&a[2],&ans);
memset(visit,0,sizeof(visit));
memset(reach,-1,sizeof(reach));
bfs();
for(int i=ans; i>=0; i--)
{
if(reach[i] >= 0)
{
printf("%d %d\n",reach[i],i);
break;
}
}
}
return 0;
}
</span>
uva好了,已经A了