三个水杯

来源:互联网 发布:linuxssh端口号配置 编辑:程序博客网 时间:2024/04/19 20:00

广搜,每次倒水有6种可能,1项2倒,1向3倒。。。。。。共6种。每次倒水的6种可能都入队。

三个水杯,盛水的状态用一个三维数组标记,若存在过,值为1。

若可以倒水,且倒水之后的状态没有存在过,则倒水次数加1,倒水后的状态入队。


#include<stdio.h>

#include<iostream>
#include<queue>
using namespace std;


int E1, E2, E3;


struct node{
int num1;
int num2;
int num3;
int time;
}l, p, q;


int bfs(int v1, int v2, int v3)
{
int i, flag;
int a[100][100][100] = {0};
queue <node> Q;
l.num1 = v1;
l.num2 = 0;
l.num3 = 0;
l.time = 0;
Q.push(l);
a[l.num1][l.num2][l.num3] = 1;
while(!Q.empty())
{
p = Q.front();
Q.pop();
if(p.num1 == E1 && p.num2 == E2 && p.num3 == E3)
{
return p.time;
}
if(p.num1 > 0 && p.num2 < v2)
{
flag = v2 - p.num2;
if(p.num1 >= flag)
{
q.num1 = p.num1 - flag;
q.num2 = v2;
}
else
{
q.num1 = 0;
q.num2 = p.num2 + p.num1;
}
q.num3 = p.num3;
if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
if(p.num1 > 0 && p.num3 < v3)
{
flag = v3 - p.num3;
if(p.num1 >= flag)
{
q.num1 = p.num1 - flag;
q.num3 = v3;
}
else
{
q.num1 = 0;
q.num3 = p.num3 + p.num1;
}
q.num2 = p.num2;
if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
if(p.num2 > 0 && p.num1 < v1)
{
flag = v1 - p.num1;
if(p.num2 >= flag)
{
q.num1 = v1;
q.num2 = p.num2 - flag;
}
else
{
q.num1 = p.num1 + p.num2;
q.num2 = 0;
}
q.num3 = p.num3;
    if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
  if(p.num2 > 0 && p.num3 < v3)
{
flag = v3 - p.num3;
if(p.num2 >= flag)
{
q.num3 = v3;
q.num2 = p.num2 - flag;
}
else
{
q.num2 = 0;
q.num3 = p.num3 + p.num2;
}
q.num1 = p.num1;
if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
if(p.num3 > 0 && p.num1 < v1)
{
flag = v1 - p.num1;
if(p.num3 >= flag)
{
q.num1 = v1;
q.num3 = p.num3 - flag;
}
else
{
q.num3 = 0;
q.num1 = p.num1 + p.num3;
}
q.num2 = p.num2;
if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
if(p.num3 > 0 && p.num2 < v2)
{
flag = v2 - p.num2;
if(p.num3 >= flag)
{
q.num2 = v2;
q.num3 = p.num3 - flag;
}
else
{
q.num3 = 0;
q.num2 = p.num2 + p.num3;
}
q.num1 = p.num1;
if(a[q.num1][q.num2][q.num3] == 0)
{
q.time = p.time + 1;
// p = q;
Q.push(q);
a[q.num1][q.num2][q.num3] = 1;
}
}
}
return -1;
}


int main(void)
{
int N, i, t, v1, v2, v3;
scanf("%d", &N);
for(i = 0; i < N; i++)
{
scanf("%d%d%d%d%d%d", &v1, &v2, &v3, &E1, &E2, &E3);
t = bfs(v1, v2, v3);
printf("%d\n", t);
}
return 0;
}
原创粉丝点击