POJ3414Pots
http://poj.org/problem?id=3414
题意 : 大意是说给你两个杯子的体积和一个目标体积,a,b,c,通过对a,b进行6种操作,调出c体积的水,6种操作分别是把a倒满,把b倒满,把a弄成空的,把b弄成空的,把a里边的倒到b里,把b里边的水倒到a里;
思路 : 算不上说多难,反正就是六种操作
#include<cstdio>
#include<cstring>
#include<iostream>
const int maxn = ;
using namespace std;
int a,b,c;
int r,l;
int vis[][];
struct node
{
int cup1,cup2,step;//两个杯子,走的步数
int mark;//进行标记,方便输出
int prev;//记录前一个状态
}ch[maxn],sh,zh;
int stepp,s;
void bfs()
{
/*初始化*/
ch[].cup1 = ;
ch[].cup2 = ;
ch[].step = ;
ch[].mark = ;
l = ,r = ;
vis[][] = ;
/*队列模拟*/
while(l<r)
{
sh = ch[l] ;
if(sh.cup1 == c||sh.cup2 == c)//结束标志
{
stepp = sh.step ;
s = l ;//输出时寻找前驱的
return ;
}
if(sh.cup1 != a)//将杯1倒满
{
zh.cup1 = a ;
zh.cup2 = sh.cup2 ;
zh.step = sh.step+ ;
zh.prev = l ;
zh.mark = ;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;//这个状态存到ch数组里
}
}
if(sh.cup2 != b)//将杯2装满
{
zh.cup2 = b ;
zh.cup1 = sh.cup1 ;
zh.step = sh.step+ ;
zh.mark = ;
zh.prev = l;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;
}
}
if(sh.cup1 != )//将杯1倒空
{
zh.cup1 = ;
zh.cup2 = sh.cup2 ;
zh.mark = ;
zh.prev = l;
zh.step = sh.step+ ;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;
}
}
if(sh.cup2 != )//将杯2倒空
{
zh.cup2 = ;
zh.cup1 = sh.cup1;
zh.mark = ;
zh.prev = l;
zh.step = sh.step+ ;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;
}
}
if(sh.cup1 != )//将杯1水倒到杯2里
{
if(sh.cup1 >= b-sh.cup2)
{
zh.cup1 = sh.cup1-(b-sh.cup2) ;
zh.cup2 = b ;
}
else
{
zh.cup2 = sh.cup1+sh.cup2 ;
zh.cup1 = ;
}
zh.step = sh.step+ ;
zh.mark = ;
zh.prev = l ;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;
}
}
if(sh.cup2 != )//将杯2水倒到杯1里
{
if(sh.cup2 >= a-sh.cup1)
{
zh.cup2 = sh.cup2- (a-sh.cup1);
zh.cup1 = a ;
}
else
{
zh.cup1 = sh.cup1+sh.cup2 ;
zh.cup2 = ;
}
zh.step = sh.step+ ;
zh.mark = ;//进行标记
zh.prev = l ;
if(!vis[zh.cup1][zh.cup2])
{
vis[zh.cup1][zh.cup2] = ;
ch[r++] = zh ;
}
}
l++ ;
}
}
void printff(int i)
{
if(i == )
return ;
printff(ch[i].prev) ;
if(ch[i].mark == ) printf("FILL(1)\n");
else if(ch[i].mark == ) printf("FILL(2)\n");
else if(ch[i].mark == ) printf("DROP(1)\n");
else if(ch[i].mark == ) printf("DROP(2)\n");
else if(ch[i].mark == ) printf("POUR(1,2)\n");
else if(ch[i].mark==) printf("POUR(2,1)\n");
}
int main()
{
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
stepp=;
memset(vis,,sizeof(vis));
bfs();
if(stepp != )
{
printf("%d\n",stepp);
printff(s);
}
else printf("impossible\n");
}
return ;
}
POJ3414Pots的更多相关文章
- poj3414--Pots(bfs,记录路径)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10149 Accepted: 4275 Special J ...
- poj3414Pots(倒水BFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13231 Accepted: 5553 Special J ...
随机推荐
- iOS开发之窗口和视图
视图就是应用程序的界面.视图可以使用nib文件实现,也可以使用代码创建.一个视图也是一个响应器(UIResponder的子类)这意味着一个视图可以与用户交互.因此,视图不只是用户可看到的界面,也是可以 ...
- 关于iOS6应用中第三方类库不支持armv7s的问题解决
今天编译ios6+cocos2d v2 .1 beta2制作的游戏,出现下面的错误: ld: file is universal (3 slices) but does not contain a(n ...
- 两个Activity之间的交互startActivityForResult的使用
代码如下: package com.zzw.teststartintentforrequest; import android.app.Activity; import android.content ...
- 左右滑动删除ListView条目Item--第三方开源--SwipeToDismiss
Android的SwipeToDismiss是github上一个第三方开源框架(github上的项目链接地址:https://github.com/romannurik/Android-SwipeTo ...
- FineUI 框架,RIA 富客户端应用的选择
FineUI 框架演示地址:http://www.fineui.com/demo/ 是asp.net 和extjs 结合的框架,可以快速创建企业应用程序的界面,节省开发时间,具体使用详见fineUI ...
- django post分号引发的问题
利用jquery的ajax传值 $.ajax({ type:"POST", url:"", data:"content"=content, ...
- oracle 外部表
CREATE TABLE "EXT_ENTRY_WORKFLOW" ( ), ), "CREATE_DATE" DATE, ), ), ), ), ), ), ...
- 折腾了好久的macos+apache+php+phpmyadmin 终于成功了!
由于最近需要布置mantis用来进行bug追踪,在此记录其过程. 由于PHP apache环境在Mac OS上是自带的,所以不需要另处下安装包,只需要简单配置一下即可. 首先打开终端输入命令: sud ...
- linux 命令grep
linux 命令grep grep命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件.通常来说,grep显示匹配的行.使用grep来搜索包括一个或多个正则表达式匹配到的文本行,然后 ...
- 微软职位内部推荐-SDE2 (Windows - Power)
微软近期Open的职位: SDE2 (Windows - Power) Windows Partner Enablement team in Operating System Group is loo ...