/* 用队列来宽度搜索 初始状态先入队,一个有六种相互倒水的可能, 把这些没有出现过的状态全部入队,依次检查。 如果检查到结果状态,就输出 如果队列为空,就输出-1 */ #include<iostream> #include<map> using namespace std; map<int,int>mm;//用来标记是否用过 int queue[1000],base,top,result,ra,rb,rc,a,b,c,term; bool f(int &x,int &y,int rx,int ry)//把x 的水倒进y里,当然需要知道x的容量和y的容量 { if(x==0||y==ry)return(false);//如果到不成就返回 int ta=a,tb=b,tc=c;//把原来的水存起来 if(x<ry-y)y+=x,x=0; else x-=ry-y,y=ry; term=10000*a+100*b+c;//得出新的方案 a=ta;b=tb;c=tc;//还原原来的水 if(mm.find(term)==mm.end())//如果新状态没有出现过 { mm[term]=mm[queue[base]]+1;//就标记一下,并且记录是第几步到的这里 if(term==result)return(true);//如果新状态是最后结果,就返回真 queue[top++]=term;//新方案入队 return(false);//返回 } return(false);//如果新方案出现过,什么都不做 } int main() { int T,x,y,z; cin>>T; while(T--) { top=base=0; cin>>ra>>rb>>rc;cin>>x>>y>>z;//输入abc的容量和要求的结果 result=x*10000+y*100+z;mm[ra*10000]=0;queue[top++]=ra*10000;//把结果转换成整数,并且入队 while(top!=base)//进入队列,一个一个检查 { a=queue[base]/10000;b=(queue[base]/100)%100;c=queue[base]%100;//先把abc还原 if(f(a,b,ra,rb)||f(a,c,ra,rc)||f(b,a,rb,ra)||f(b,c,rb,rc)||f(c,a,rc,ra)||f(c,b,rc,rb))break; base++; } if(mm.find(result)!=mm.end())cout<<mm[result]<<endl;//如果找到结果就输出最小步数 else cout<<"-1\n";//否则输出-1 mm.clear(); } return(0); }
相关推荐
南阳理工oj离线题库
南阳理工学院OJ第1版解题报告V1.0.pdf
南阳理工学院OJ_个人AC代码包(Java提交) 是Java初学者登堂入室的很好例子。
南阳理工学院stl练习场全部ac代码!
南阳理工ACM离线题库
哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案
西安理工大学学生在线实验系统编程题答案(超级详细)
山东理工大学2016级OJ进程,始于悦行,终于诚信。
基于Laravel 5.0的OJ题解网站 , 目前涵盖安科OJ,南阳OJ,杭电OJ ,北大OJ,浙大OJ.zip
(1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj...
趣味题:柱状图排序 西安理工大学学生在线实验系统 oj
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果...
DFS:depth first search深度优先搜索(迷宫寻路) BFS:breadth first search宽度优先搜索(迷宫最短路径) OJ习题答案
湖南理工学院OJ的0-100题解.rar
在线OJ网址大全在线OJ网址大全在线OJ网址大全在线OJ网址大全
山东理工大学2016级OJ题目1833
山东理工大学2016级OJ题目1834
搭建OJ平台的工具,方便大家搭建自己的OJ,建议大家使用ubuntu14.04版本,比较稳定
OJ习题.zip
厦门理工学院软件工程重点课件,考试前抱佛脚可用。