韩信走马分油c++

devtools/2024/10/19 2:30:24/

韩信走马分油c++

  • 题目
  • 算法
  • 代码

题目

  • 把油桶里还剩下的10斤油平分,只有一个能装3斤的油葫芦和一个能装7斤的瓦罐。如何分。

算法

  1. 油壶编号0,1,2。不同倒法有:把油从0倒进0(本壶到本壶,无效),从0倒进1,从0倒进2;从1倒进0,从1倒进1(无效),从1倒进2;从2倒进0,从2倒进1,从2倒进2(无效)。此过程可用二个for循环来摸拟,见下图。
  2. 为方便计算,以这种倒法为一次大循环,然后再不停地重复倒油。每次倒油,3个壶中的油量:10,0,0(举个例)是确定值,存入向量vector中。
  3. 每种结果,再重复1中的9种倒法,又会产生更多的油量结果vector[0]、vector[1]、vector[2]。结果产生更多的结果……
  4. 符合广度优先算法。用双端队列存储每一种结果,把初始值(10,0,0)入队。取出进行处理(相互之间倒油,有9种可能),将结果入队。再出队,处理,再入队,直到队列为空。
  5. 倒油的结果(10,0,0),其种类是有限的,不同的倒油方法会产生重复结果现象,用map来去重。而且map还可以记录油的变化过程,即map[vector0]=vector0是初始,以后产生一个新结果作为键,值为上一次的状态。
    在这里插入图片描述

代码

#include<iostream>
#include<vector>
#include<map>
#include<deque>
using namespace std;
//判断油壶的状态是否符合结果,即有没有出现5l油量的壶 
bool ok(vector<int>& v,int goal){for(int n:v){if(n==goal) return true;}return false;
}
//广度优先算法 
bool f(int* a,vector<int> v,int goal){deque<vector<int> > q;//双端队列 q.push_back(v);//初始值入队 map<vector<int>,vector<int> >  m;m[v]=v;while(1){int n=q.size();if(n==0) return false;for(int i=0;i<n;i++){vector<int> t=q.front();if(ok(t,goal)){while(m[t]!=t){cout<< t[0] <<"-"<< t[1]<< "-"<<t[2]<<endl;t=m[t];}return true;} q.pop_front();//倒油,从i壶倒进j壶 for(int i=0;i<3;++i)for(int j=0;j<3;++j){if(i==j) continue;if(t[i]==0) continue;if(t[j]==a[j]) continue;vector<int> t1=t;t1[j]+= t1[i];t1[i]=0;if(t1[j]>a[j]){//接收的油超过其容量 t1[i]=t1[j]-a[j];t1[j]=a[j];}if(m.count(t1)) continue;m[t1]=t;q.push_back(t1);} }}
}
int main(){int a[]={10,7,3};vector<int> v={10,0,0};f(a,v,5);return 0;
}

http://www.ppmy.cn/devtools/126891.html

相关文章

GIT batch的支持中文的方法和系统建议

GIT batch是window下原生的GIT命令行终端&#xff0c;兼顾了GIT的命令特性&#xff0c;同时也支持很多UNIX的原生的bash交互方法。但是由于编码问题&#xff0c;在使用GIT bach的时候&#xff0c;用户可能会遇到中文支持的问题。这里简单介绍一下GIT batch在Windows系统下如何有…

【JAVA毕业设计】基于Vue和SpringBoot的渔具租赁系统

本文项目编号 T 005 &#xff0c;文末自助获取源码 \color{red}{T005&#xff0c;文末自助获取源码} T005&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 渔…

Docker下安装RabbitMQ

文章目录 Docker下安装RabbitMQ1. 下载Rabbitmq镜像2. 创建并运行RabbitMQ容器3. 查看启动情况4. 启动RabbitMQ访问的Web客户端4-1 方法一 进入容器开启4-2 方法二 直接开启5. 浏览器访问RabbitMQ的Web客户端页面6. Web客户端页面问题6-1 问题展示6-2 解决方案 Docker下安装Rab…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…

自监督学习:引领机器学习的新革命

引言 自监督学习&#xff08;Self-Supervised Learning&#xff09;近年来在机器学习领域取得了显著进展&#xff0c;成为人工智能研究的热门话题。不同于传统的监督学习和无监督学习&#xff0c;自监督学习通过利用未标注数据生成标签&#xff0c;从而大幅降低对人工标注数据…

疗愈门店系统|个案疗愈系统|疗愈小程序对美业门店管理有哪些作用?美业收银系统源码

疗愈门店系统在门店管理中发挥着重要的作用&#xff0c;主要体现在以下几个方面&#xff1a; 1.预约和客户管理&#xff1a; 疗愈门店系统可以用于预约管理和客户信息记录。通过这种系统&#xff0c;门店能够更有效地安排治疗师的时间表&#xff0c;跟踪客户的预约情况&#…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天&#xff0c;数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言&#xff0c;不仅在企业级应用开发中占据主导地位&#xff0c;也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据&#xff0c;为数据分析、机…