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& ...
随机推荐
- Codeforces Round #287 (Div. 2) B. Amr and Pins 水题
B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Qt线程外使用Sleep
一:方法1 QTime t; t.start(); while(t.elapsed()<1000){ QCoreApplication::processEvents();} 二:方法2 ...
- php 获取开始日期与结束日期之间所有日期
话不多说,源码奉上! function getDateRange($startdate, $enddate) { $stime = strtotime($startdate); $etime = st ...
- Tasker to proximity screen on
in my previous entry, i posed an idea how to use the built-in proximity sensor to turn the screen of ...
- 在Linux下使用sprintf代替atoi实现整型转化为char*
程序中需要用到将整型转化为char*类型,然后将两个char*类型的变量拼接.将整型转化为char*自然想到了itoa函数: 头文件:#include <stdio.h> char *it ...
- java基础学习总结——方法的重载(overload)
一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...
- python接口自动化24-有token的接口项目使用unittest框架设计
获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...
- Peter Norvig:学习在于挑战和重复
黄小非译注(本文来自伯乐在线):本文作者Peter Norvig目前任职于Google,其职位是研究主管(Director of Research). Peter Norvig是享誉世界的计算机科学 ...
- jdbc连接遭遇RAC设备
今天进行junit的Case回归测试,功能测试人员告知数据库ip进行了变更,于是 将jdbc连接的url进行了相应的变更如下 jdbcConnection = java.sql.DriverManag ...
- hadoop安装入门
1.jdk安装和配置 1.1下载最新jdk文件 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18802 ...