这个题是典型的bfs,,,,
思路不难,就是a,b,c三杯水,互相倒,,,但是有条件,加入a杯要向杯里倒水的话,必须满足一、a杯中有水,二、b杯还未盛满。
这样写下来队列就受不了了。。。。。以为有不断重复的情况,,,,,没一种重复的情况, 底下的所有层的数据都是重复的,要做很多的无用功。。。
因此,我采用的vis[]数组来记录。。已保证程序不再做无用功。。。
代码如下:
#include <cstdio>
#include <cstring>
#define M 1000
int queue[M][3], sum[M], v[3], vis[200][200], goal;
void bfs()
{
int ok = 0, rear = 0, front = 1;
queue[0][0] = queue[0][1] = 0; queue[0][2] = v[2]; sum[0] = 0;
vis[0][0] = 1;
while(!ok&&front>rear)
{
int cup[3], s;
cup[0] = queue[rear][0], cup[1] = queue[rear][1], cup[2] = queue[rear][2],
s = sum[rear];
for(int i = 2; !ok&&i >= 0; i--) for(int j = 2; !ok&&j >= 0; j--) if(i!=j&&cup[i]>0&&cup[j]<v[j])
{
if(cup[i]>=v[j]-cup[j])
{
sum[front] = s + v[j] - cup[j];
queue[front][i] = cup[i] - v[j] + cup[j];
queue[front][j] = v[j];
}
else
{
sum[front] = s + cup[i];
queue[front][i] = 0;
queue[front][j] = cup[j] + cup[i];
}
for(int k = 0; k < 3; k++)
if(k!=i&&k!=j)
queue[front][k] = cup[k];
else if(queue[front][k]==goal)
{ok = 1; printf("%d %d\n",sum[front], goal); break;}
if(!vis[queue[front][0]][queue[front][1]]){ vis[queue[front][0]][queue[front][1]] = 1; front++;}
}
rear++;
}
}
int main ()
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i = 0; i < 3; i++) scanf("%d",&v[i]);
scanf("%d",&goal);
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}