当前位置: 首页 > article >正文

韩信走马分油c++

韩信走马分油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.kler.cn/news/355328.html

相关文章:

  • asp.net core Partial 分部视图、视图组件(core mvc 才支持)、视图、razor page、mvc
  • 在 Android 开发中,如何实现蓝牙连接设备?
  • LIN从节点:识别帧头各场长度测试
  • linux IP更新后系统环境无法访问127.0.0.1
  • 黑马程序员-redis项目实践笔记1
  • Pandas数据类型
  • 基于强化学习的多码头集卡路径优化
  • SQL进阶技巧:如何删除第N次连续出现NULL值所存在的行?
  • linux git submodule 需要输入密码的问题
  • 计算PSNR, SSIM, VAMF工具
  • 网络攻击的新趋势:勒索软件与零日漏洞
  • 单例模式(自动加载)
  • 手机在网状态接口的使用和注意事项
  • Android常用界面控件——ImageView
  • 新员工入职流程指南_完整入职流程解析
  • 文心智能体:我的旅游小助手
  • 代理IP在爬虫中的作用是什么?
  • 机器学习导论
  • ORACLE 批量插入更新删除sql
  • FreeRTOS - 任务管理