C#实现倒油算法
原题如下:12(a桶 满的 有12斤油)斤桶里 取出6斤油 有 另外有8斤(b桶)和5斤(c桶)两个空桶 让程序输出取出这6斤油的步骤
现在实现的算法可以配参数(定义有几个桶,初始有多少油,要得到多少油,都可以配),并且找出任意(多条线路或者找不到)满足条件的倒油线路图:
运行效果:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication2{class Program {static void Main(string[] args) {//在此自定义相关初始信息 Oil.初始油量 = "12,0,0"; Oil.桶的容量 = "12,8,5"; Oil.需求油量 = "6"; Oil oil = new Oil(); Status SuperStatus = oil.GetStartState(); oil.status.Add(SuperStatus); oil.执行(SuperStatus);if (oil.Endstatus.Count == 0) { Console.WriteLine("无法倒出指定质量大小的油。"); }else { Console.WriteLine("共找到" + oil.Endstatus.Count.ToString()+"条倒油线路:"); }for (int i = 0; i < oil.Endstatus.Count; i++) { Console.WriteLine(oil.翻译路线(oil.Endstatus[i])); } } }class Oil {public static string 桶的容量;public static string 初始油量;public static string 需求油量;//自动记录桶的总数int count;public Oil() { count = 桶的容量.Split(',').Count(); capacity = new int[count];for (int i=0;i<count;i++) { capacity[i] = Convert.ToInt32(桶的容量.Split(',')[i]); } }public int[] capacity; //new int[] { 12, 8, 5 };public List<Status> status = new List<Status>();public List<Status> Endstatus = new List<Status>(); Status 倒油(Status state, int a, int b) {//排除不可倒的情况if (state.OilState[a] == 0return null;if (state.OilState[b] == capacity[b]) return null;//倒油操作//先定义成功倒油后的新状态 Status newStatus = new Status(); newStatus.OilState = new int[count]; state.OilState.CopyTo(newStatus.OilState, 0); newStatus.Father = state;if (state.OilState[a] > capacity[b] - state.OilState[b]) { newStatus.OilState[a] -= capacity[b] - state.OilState[b]; newStatus.OilState[b] = capacity[b]; }else { newStatus.OilState[a] = 0; newStatus.OilState[b] += state.OilState[a]; }//判断倒油后的新状态是否在状态列表中存在bool IsExist = false;foreach (var s in status) {bool mark = true;for (int i = 0; i < newStatus.OilState.Count(); i++) {if (newStatus.OilState[i] != s.OilState[i]) mark = false; }if (mark) { IsExist = true;break; } }if (IsExist) {return null; }else { status.Add(newStatus);return newStatus; } }public void 执行(Status SuperStatus) {//如果找到一条路线if (SuperStatus.OilState.Contains(Convert.ToInt32(需求油量))) { Endstatus.Add(SuperStatus); ArrangeStatus(); 执行(GetStartState());return; }for (int a = 0; a < count; a++) {for (int b = 0; b < count; b++) {if (b != a) { Status newStatus = 倒油(SuperStatus, a, b);if (newStatus != null) { 执行(newStatus); } } } } }public string 翻译路线(Status endState) {string theWay = string.Empty; Status s = endState;while (s != null) {string wayNode = string.Empty;foreach (var a in s.OilState) { wayNode += a.ToString() + " "; }if (theWay == string.Empty) theWay += wayNode;else theWay = wayNode.Trim() + "→" + theWay; s = s.Father; }return theWay; }/// <summary>/// 整理状态表,为寻求新路线做准备/// </summary>public void ArrangeStatus() { status.Clear();for (int i = 0; i < Endstatus.Count; i++) { Status s = Endstatus[i];while (s != null) { status.Add(s); s = s.Father; } } }/// <summary>/// 获取开始状态/// </summary>/// <returns></returns>public Status GetStartState() { Status status = new Status(); status.Father = null; status.OilState = new int[count];for (int i = 0; i < count; i++) { status.OilState[i] = Convert.ToInt32(初始油量.Split(',')[i]); }return status; } }/// <summary>/// 记录各桶当前所装油量的状态信息/// </summary>class Status {public int[] OilState;public Status Father; }}
C#实现倒油算法的更多相关文章
- 二、油泼面(Oil spill noodle)
油泼面 油泼面是陕西传统的特色面食之一,起源于周代,并以咸阳油泼面最为著名,有鲜香味.酸辣味.香辣味. 油泼面是一种很普通的面食制作方法,将手工制作的面条在开水中煮熟后捞在碗里,将葱花碎.花椒粉.盐等 ...
- NLP-BM25算法理解
前两天老师给我们讲解了BM25算法,其中包括由来解释,以及算法推导,这里我再将其整理,这里我不讲解之前的BIM模型,大家有兴趣可以自行了解.Okapi BM25:一个非二值的模型bm25 是一种用来评 ...
- 设计模式(十四)模板方法模式(Template Pattern)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- C#设计模式-模板方法模式
提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...
- 模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 14.模板方法模式(Template Method)
using System; namespace ConsoleApplication7 { class Program { /// <summary> /// 模板方法模式——在一个抽象类 ...
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 【15】模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...
- DesignPattern(五)行为型模式(上)
行为型模式 行为型模式是对在不同对象之间划分责任和算法的抽象化.行为模式不仅仅关于类和对象,还关于它们之间的相互作用.行为型模式又分为类的行为模式和对象的行为模式两种. 类的行为模式——使用继承关系在 ...
随机推荐
- MMORPG战斗系统随笔(四)、优化客户端游戏性能
转载请标明出处http://www.cnblogs.com/zblade/ 说到游戏性能,这是一个永恒的话题.在游戏开发的过程中,性能问题一直是我们研发需要关注的一个节点.当然,说句客观话,很多程序员 ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库之EF实体类与数据库结构
大家都知道在关系型数据库中每张表的每个字段都会有自己的属性,如:数据类型.长度.是否为空.主外键.索引以及表与表之间的关系.但对于C#编写的类来说,它的属性只有一个数据类型和类与类之间的关系,但是在M ...
- ZOJ2105 终于找到错误
ZOJ2105:点击打开链接 错误代码 #include<stdio.h> #include<stdlib.h> int q[110]; int main() { int a, ...
- 微信企业号C#开发配置API
微信开发第一步 : 配置API,实现接收消息服务配置 1.在下图界面先填好内容,事件消息处理可自行选择,我这里是没处理的 2.第二步: 使用vs 进行代码的编写,以下是我的代码.LogTextHe ...
- SAP 参照sto订单创建外向交货BAPI
DATA: SHIP_POINT TYPE TVST-VSTEL, "装运点/接收点 NUM_DELIVERIES TYPE VBNUM, STOCK_TRANS_ITEMS WITH HE ...
- 2017年十大奇葩画风的H5页面案例,原来脑洞可以这样大
每个人都是视觉动物,画面精美.体验奇特的H5,用户在内心一般都会满分打出,毫不吝啬,同时也毫不犹豫分享,因为此时的分享不掉价儿~ 今天给大家准备了十支H5,画风超级奇特,非常值得一看所有案例均可在19 ...
- 双11电商剁手节,最全的H5互动营销案例合集
距离双11不足一个月! 是否准备好为双十一疯狂剁手! 自从天猫2009年首创双11购物节以来双十一不仅成为了消费者的"剁手日" 更是每年企业营销的"狂欢节" 各 ...
- jscodeshift 简易教程
本文首发于 https://github.com/whxaxes/blog/issues/10 背景 jscodeshift 是 fb 出的一个 codemod toolkit,基于 recast 这 ...
- ssh -T git@github.com出现Permission denied (publickey)
参考自:http://blog.csdn.net/sunnypotter/article/details/18948053 参考自:http://stackoverflow.com/questions ...
- 12.21-Android ServerSocket
建立ServerSocket服务器 1.new ServerSocket对象servierSocket 2.接收客户端请求Socket client = servierSocket.accept(); ...