POJ 3414 dfs 回溯
题目链接: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 回溯的更多相关文章
- 【POJ - 3009】Curling 2.0 (dfs+回溯)
-->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- POJ 3414 Pots
Pots Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 素数环(dfs+回溯)
题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...
- NOJ 1074 Hey Judge(DFS回溯)
Problem 1074: Hey Judge Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
随机推荐
- 奔小康赚大钱---hdu2255(最大带权匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题的模板: 运用KM算法: #include<stdio.h> #incl ...
- c primer plus(五版)编程练习-第八章编程练习
1.设计一个程序,统计从输入到文件结尾为止的字符数. #include<stdio.h> int main(void){ int ch; int i; i=; while((ch = ge ...
- PHP实现返回JSON和XML的类分享
PHP实现返回JSON和XML的类分享 <?php class Reponse{ //private $result = array('code'=null,'messa ...
- MySQL从删库到跑路(三)——SQL语言
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.SQL语言简介 1.SQL语言简介 SQL是结构化查询语言(Structured Query Language) ...
- Es+kafka搭建日志存储查询系统(设计)
现在使用的比较常用的日志分析系统有Splunk和Elk,Splunk功能齐全,处理能力强,但是是商用项目,而且收费高.Elk则是Splunk项目的一个开源实现,Elk是ElasticSearch(Es ...
- py文件生成pyc
鼠标右键 在此处打开命令行 python -m compileall xxx.py可以对当前目录下的xxx.py文件生成pyc
- kylin与superset整合
前提: kylin安装以及配置可以参考 https://www.cnblogs.com/654wangzai321/p/9676204.html 我这边用的Linux自带的python2.7,为了保证 ...
- MySql如何安装?
官方网址:https://www.mysql.com/downloads/ Community——>MySqlCommunity Server->GA->64位: GA:正式版: C ...
- Sybase数据库第三方软件安装
Sybase数据库第三方软件安装 1,安装软件:IQNC160011P_1-20011253.ZIP
- linux中readl()和writel()函数---用于读写寄存器
writel() 往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节). 原型: #include <asm/io.h> void writel ...