题目链接:http://poj.org/problem?id=3414

题意:三个值A, B, C, A和B是两个杯子的容量,问最短操作数使A或者B里的水量是C。有三种操作。

思路:dfs.暴力 很简单。唯一不同的大概是这次做搜索都是自己想方设法的代码实现。中途很多问题。求得不是最大值。怎么保存操作过程。但好像不是原创方法。

附AC代码:

 // dfs 开始觉得一定是bfs 我只要把两个杯子的各种操作遍历一遍 直到某个杯子里的水和C相等就结束。
// 然后想到的是如何分开这两个杯子。因为一次操作改变的不一定是一个值。所以两个杯子的值也不能放在一个队列里遍历。
// 于是。就是dfs。觉得回溯时dfs参数为空和不回溯dfs参数有两个都是可以的。
// 详见代码。 #include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; int va, vb, c;
int vis[][];
int anss;
string ans;
string temp; void dfs(int aa, int bb, int step) {
if (aa == c || bb == c) {
if (anss > step) {
anss = step;
ans = temp;
}
return;
}
int a = aa, b = bb;
vis[a][b] = ;
string t = "";
// fill a
if (a < va) {
a = va;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
vis[a][b] = ;
temp = t;
}
a = aa;
}
// drop a
if (a > ) {
a = ;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
vis[a][b] = ;
temp =t;
}
a = aa;
}
// pour a to b
if (a > && b < vb) {
int ma = min(a, vb-b);
a -= ma;
b += ma;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
vis[a][b] = ;
temp = t;
}
a = aa, b = bb;
} // fill b
if (b < vb) {
b = vb;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
vis[a][b] = ;
temp = t;
}
b = bb;
}
// drop b
if (b > ) {
b = ;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
temp = t;
vis[a][b] = ;
}
b = bb;
}
// pour b to a
if (b > && a < va) {
int mb = min(b, va-a);
b -= mb;
a += mb;
if (vis[a][b] == ) {
vis[a][b] = ;
t = temp;
temp += "";
dfs(a, b, step+);
temp = t;
vis[a][b] = ;
}
a = aa;
b = bb;
}
return;
} int main() {
int a, b, step;
while(cin >> va >> vb >> c) {
anss = ;
a = , b = , step = ;
memset(vis, , sizeof(vis));
temp = "";
dfs(a, b, step);
if (anss == ) {
cout << "impossible\n";
continue;
}
cout << anss << endl;
int len = ans.length();
for (int i=; i<len; ++i) {
if (ans[i] == '') cout << "FILL(1)\n";
if (ans[i] == '') cout << "DROP(1)\n";
if (ans[i] == '') cout << "POUR(1,2)\n";
if (ans[i] == '') cout << "FILL(2)\n";
if (ans[i] == '') cout << "DROP(2)\n";
if (ans[i] == '') cout << "POUR(2,1)\n";
}
}
return ;
}

POJ 3414 dfs 回溯的更多相关文章

  1. 【POJ - 3009】Curling 2.0 (dfs+回溯)

    -->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...

  2. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

  3. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  4. BFS POJ 3414 Pots

    题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...

  5. 【BFS】POJ 3414

    直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...

  6. POJ 3414 Pots

    Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  7. 素数环(dfs+回溯)

    题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...

  8. NOJ 1074 Hey Judge(DFS回溯)

    Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format: ...

  9. 广搜+输出路径 POJ 3414 Pots

    POJ 3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13547   Accepted: 5718   ...

随机推荐

  1. Python爬虫实例(五) requests+flask构建自己的电影库

    目标任务:使用requests抓取电影网站信息和下载链接保存到数据库中,然后使用flask做数据展示. 爬取的网站在这里 最终效果如下: 主页: 可以进行搜索:输入水形物语 点击标题进入详情页: 爬虫 ...

  2. CF734F Anton and School 构造+数论

    正解:构造 解题报告: 先放下传送门QwQ 这题首先要知道一个结论:(x&y)+(x|y)=x+y 还是能理解的趴? 所以我们把bi+ci就能得到∑a+n*a[i] 然后我们就能成功求出∑a ...

  3. 【Python学习 】Python实现的FTP上传和下载功能

    一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...

  4. python pip源配置

    一.Linux版本: linux的文件存放在:~/.pip/pip.conf 二.windows版本: 在用户文件夹下创建pip目录,并在pip目录下创建pip.ini文件(%HOME%\pip\pi ...

  5. [JS]1.Hello Word

    1.Hello Word <!DOCTYPE html> <html> <head> <title>Hello World!</title> ...

  6. VS异常--未找到与约束 ContractName Microsoft.VisualStudio.Language.Intellisense.IGlyphService RequiredTypeIdentity

    早上打开项目的时候突然遇到这么个错误: ======================= 未找到与约束 ContractName Microsoft.VisualStudio.Language.Inte ...

  7. numpy模块学习笔记

    # encoding=utf-8 import numpy as np from numpy.linalg import * def main(): # 1.最基本的array lst = [[1, ...

  8. centOS下升级python版本,详细步骤

    1.可利用linux自带下载工具wget下载,如下所示:(  笔者安装的是最小centos系统,所以使用编译命令前,必须安装wget服务,读者如果安装的是界面centos系统,或者使用过编译工具则可跳 ...

  9. OpenResty api 网关

    1,Orange网关 Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下 ...

  10. IP地址与MAC地址

    作者:知乎用户链接:https://www.zhihu.com/question/21546408/answer/28155896来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...