hdu4490 Mad Veterinarian(bfs)
Mad Veterinarian
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 249 Accepted Submission(s): 104
Special Judge
Machine A turns one ant into one beaver.
Machine B turns one beaver into one ant, one beaver and one cougar.
Machine C turns one cougar into one ant and one beaver.
Can we convert a beaver and a cougar into 3 ants?

Can we convert one ant into 2 ants? NO
These puzzles have the properties that:
1. In forward mode, each machine converts one animal of a given species into a finite, non-empty collection of animals from the species in the puzzle.
2. Each machine can operate in reverse.
3. There is one machine for each species in the puzzle and that machine (in forward mode) takes as input one animal of that species.
Write a program to find the shortest solution (if any) to Mad Veterinarian puzzles. For this problem we will restrict to Mad Veterinarian puzzles with exactly three machines, A, B, C.
The first line of each data set consists of two decimal integers separated by a single space. The first integer is the data set number. The second integer is the number, N, of puzzle questions. The next three input lines contain the descriptions of machines A, B and C in that order. Each machine description line consists of three decimal integers separated by spaces giving the number of animals of type a, b and c output for one input animal. The following N lines give the puzzle questions for the Mad Veterinarian puzzle. Each contains seven decimal digits separated by single spaces: the puzzle number, the three starting animal counts for animals a, b and c followed by the three desired ending animal counts for animals a, b and c.
1 2
0 1 0
1 1 1
1 1 0
1 0 1 1 3 0 0
2 1 0 0 2 0 0
2 2
0 3 4
0 0 5
0 0 3
1 2 0 0 0 0 5
2 2 0 0 0 0 4
1 3 Caa
2 NO SOLUTION
2 2
1 NO SOLUTION
2 25 AcBcccBccBcccAccBccBcccBc
很水的题,不过我写了好长好长,太不符合我的风格了,刚开始调试的时候无解的情况表示不出来,因为它的数据可以一直往上涨,最后限制了一下,看学长的博客说的最多8个,加这个限制就可以了,好不容易调试出来了,结果跟示例对不上,过了好久才想到方法可能不止一种,于是提交了,结果就AC了。。。0ms
写的有点长,不过很多就是差不多的,看起来应该不费力吧,这题的输入数据很蛋疼要小心
#include<stdio.h>
#include<string.h>
#define M 8
struct node
{
int a,b,c,f;
char o;
}f[4],s[1000],start,end;
int visit[10][10][10];
int bfs()
{
int t=0,w=1;
memset(visit,0,sizeof(visit));
visit[s[t].a][s[t].b][s[t].c]=1;
s[0].f=-1;
while(t<w)
{
if(s[t].a>0)
{
s[w].a=s[t].a+f[0].a-1;
s[w].b=s[t].b+f[0].b;
s[w].c=s[t].c+f[0].c;
s[w].f=t;
s[w].o='A';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
if(s[t].b>0)
{
s[w].b=s[t].b+f[1].b-1;
s[w].a=s[t].a+f[1].a;
s[w].c=s[t].c+f[1].c;
s[w].f=t;
s[w].o='B';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
if(s[t].c>0)
{
s[w].c=s[t].c+f[2].c-1;
s[w].b=s[t].b+f[2].b;
s[w].a=s[t].a+f[2].a;
s[w].f=t;
s[w].o='C';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
if(s[t].a>=f[0].a&&s[t].b>=f[0].b&&s[t].c>=f[0].c)
{
s[w].a=s[t].a-f[0].a+1;
s[w].b=s[t].b-f[0].b;
s[w].c=s[t].c-f[0].c;
s[w].f=t;
s[w].o='a';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
if(s[t].a>=f[1].a&&s[t].b>=f[1].b&&s[t].c>=f[1].c)
{
s[w].b=s[t].b-f[1].b+1;
s[w].a=s[t].a-f[1].a;
s[w].c=s[t].c-f[1].c;
s[w].f=t;
s[w].o='b';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
if(s[t].a>=f[2].a&&s[t].b>=f[2].b&&s[t].c>=f[2].c)
{
s[w].c=s[t].c-f[2].c+1;
s[w].b=s[t].b-f[2].b;
s[w].a=s[t].a-f[2].a;
s[w].f=t;
s[w].o='c';
if(s[w].a<M&&s[w].b<M&&s[w].c<M&&!visit[s[w].a][s[w].b][s[w].c])
{
if(s[w].a==end.a&&s[w].b==end.b&&s[w].c==end.c)
{
end.f=w;
return w;
}
visit[s[w].a][s[w].b][s[w].c]=1;
w++;
}
}
t++;
}
return 0;
}
int main()
{
int t,i,j,n,num,tt;
char cou[100];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&num,&n);
printf("%d %d\n",num,n);
for(i=0;i<3;i++)
scanf("%d%d%d",&f[i].a,&f[i].b,&f[i].c);
while(n--)
{
scanf("%d%d%d%d%d%d%d",&tt,&s[0].a,&s[0].b,&s[0].c,&end.a,&end.b,&end.c);
printf("%d ",tt);
if(i=bfs())
{
for(j=98;i>0;j--)
{
cou[j]=s[i].o;
i=s[i].f;
}
cou[99]='\0';
printf("%d ",98-j);
puts(cou+j+1);
}
else puts("NO SOLUTION");
}
}
return 0;
}
hdu4490 Mad Veterinarian(bfs)的更多相关文章
- Regionals 2012, North America - Greater NY 解题报告
这套题..除了几何的都出了 完全没时间学几何.杯具 A,B,J 水题不解释 C.Pen Counts 这题的话 写几个不等式限制边得范围就行了 然后枚举最小边 D.Maximum Random Wal ...
- Lesson 21 Mad or not?
Text Aeroplanes are slowly driving me mad. I live near an airport and passing planes can be heard ni ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- Sicily 1215: 脱离地牢(BFS)
这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...
- Sicily 1048: Inverso(BFS)
题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...
- Sicily 1444: Prime Path(BFS)
题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...
随机推荐
- mysql-5.7.10产生的日志时间与系统时间不一致
问题描述: 使用安装的mysql workbench登录mysql后,选择server log 进行日志查看的时候,发现产生日志的时间和当期的系统时间不一致:如下图: 查看mysql系统的当期时间显示 ...
- Git_添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- CentOS 7挂载磁盘提示: mount: unknown filesystem type 'LVM2_member'
说明:CentOS 7采用新的分区格式xfs以及LVM的模式,造成挂载硬盘的方式有变化. 解决: 使用lvdisplay命令查看LVM最终的卷路径,然后再进行挂载. 比如: mount /dev/Vo ...
- Win8开机直接进桌面方法
最新的Win8系统由于新增开始屏幕(UI)界面,专门为触摸设备准备,并且很多喜欢尝鲜的电脑爱好者朋友在我们传统的电脑上安装了Win8系统,不少PC用户开始都不喜欢Win8开机后进入UI界面而非传统的电 ...
- More about STALL
http://fx.damasgate.com/more-about-stall/ In other USB classes, a sender can indicate the end of a t ...
- 算法学习 - 平衡二叉查找树实现(AVL树)
平衡二叉查找树 平衡二叉查找树是非常早出现的平衡树,由于全部子树的高度差不超过1,所以操作平均为O(logN). 平衡二叉查找树和BS树非常像,插入和删除操作也基本一样.可是每一个节点多了一个高度的信 ...
- MVC无限级分类02,增删改查
继上一篇"MVC无限级分类01,分层架构,引入缓存,完成领域模型与视图模型的映射",本篇开始MVC无限级分类的增删改查部分,源码在github. 显示和查询 使用datagrid显 ...
- C# 结构体定义 转换字节数组 z
客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性. [StructLayoutAttribute(LayoutKind.Sequent ...
- [翻译] RBBAnimation,让你使用关键帧动画更便利
RBBAnimation RBBAnimation is a subclass of CAKeyframeAnimation that allows you to declare your anima ...
- dwz ajax session超时跳转登录页(struts2自定义拦截器)
1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter; import java.util.Map; import javax.servlet.http ...