三个水杯
来源:互联网 发布: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;
}
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯问题
- NYOJ21 三个水杯
- Android 中 -Java中byte[]转String问题
- ZOJ1111:Poker Hands(模拟题)
- 回朔算法
- 为jframe窗口设置背景图片
- paip.云计算以及分布式计算的区别
- 三个水杯
- 项目拖沓,应该坚持还是放弃?
- hibernate映射关系 一对多、多对一单向关联 一对多双向关联
- vsftp 安装
- 《程序员的思维修炼》阅读笔记
- java awt 简单示例 BorderLayout
- 制作演示文稿的PowerPoint 技巧
- 给自己加油!
- uva-10474