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 ...
随机推荐
- 转!!spring @component 详解 默认初始化bean的名字 VNumberTask类 就是 VNumberTask
参考链接:信息来源 今天碰到一个问题,写了一个@Service的bean,类名大致为:CUser xml配置: <context:component-scan base-package=&quo ...
- ManyToMany参数(through,db_constraint)
through : 指定自己写好的第三张表,我们可以给第三张表添加字段了(告诉Django不用建第三张表了,我们都给他配好了) class Book(models.Model): name=model ...
- python知识大全目录,想学的看过来!
Python总结篇——知识大全 python装饰器 PyCharm安装与配置,python的Hello World sort与sorted的区别及实例 我必须得告诉大家的MySQL优化 ...
- 预训练模型与Keras.applications.models权重资源地址
什么是预训练模型 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型.你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手. ...
- springboot中的常用注解
springboot中的常用注解个人觉得springboor中常用的注解主要可以分为三种:放入容器型注解.从容器中取出型注解和功能型注解.其中的放入容器型和从容器中取出型就是我们平时所说的控制反转和依 ...
- BackgroundWorker+ProgressBar+委托 实现多线程、进度条
上文在<C# 使用BackgroundWorker实现WinForm异步>介绍了如何通过BackgroundWorker实现winForm异步通信,下面介绍如何通过BackgroundWo ...
- NPOI+反射+自定义特性实现上传excel转List及验证
1.自定义特性 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public ...
- Restoring Numbers
D. Restoring Numbers ...
- laravel 多图上传
前台 name="photo[]" 后台获取 $request->file('photo');//获取多个图片循环
- HDU1059 二进制拆分优化多重背包
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> ...