原题如下: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#实现倒油算法的更多相关文章

  1. 二、油泼面(Oil spill noodle)

    油泼面 油泼面是陕西传统的特色面食之一,起源于周代,并以咸阳油泼面最为著名,有鲜香味.酸辣味.香辣味. 油泼面是一种很普通的面食制作方法,将手工制作的面条在开水中煮熟后捞在碗里,将葱花碎.花椒粉.盐等 ...

  2. NLP-BM25算法理解

    前两天老师给我们讲解了BM25算法,其中包括由来解释,以及算法推导,这里我再将其整理,这里我不讲解之前的BIM模型,大家有兴趣可以自行了解.Okapi BM25:一个非二值的模型bm25 是一种用来评 ...

  3. 设计模式(十四)模板方法模式(Template Pattern)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  4. C#设计模式-模板方法模式

    提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...

  5. 模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  6. 14.模板方法模式(Template Method)

    using System; namespace ConsoleApplication7 { class Program { /// <summary> /// 模板方法模式——在一个抽象类 ...

  7. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  8. 【15】模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...

  9. DesignPattern(五)行为型模式(上)

    行为型模式 行为型模式是对在不同对象之间划分责任和算法的抽象化.行为模式不仅仅关于类和对象,还关于它们之间的相互作用.行为型模式又分为类的行为模式和对象的行为模式两种. 类的行为模式——使用继承关系在 ...

随机推荐

  1. Mac上搭建基于Github的Hexo博客

    Mac 上搭建基于Github的hexo博客 博客地址:往事亦如风的博客 hexo官方文档 本来想搭一个自己的博客,但是因为服务器真心买不起,所以就使用gitpages搭建一个免费的博客. 环境配置 ...

  2. Ubuntu16.04 install eclipse-jee-oxygen-R-linux-gtk-x86_64

    下面如何在Ubuntu16.04 下面怎么下载Java EE并创建在桌面快捷上下载Java EE:eclipse下载Java EE官网:http://www.eclipse.org/downloads ...

  3. web前端面试官挖的那些坑(js)

    题目1: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () ...

  4. MySQL 高效查询

    在“现场加号&预约排队”项目中,“号贩子排查任务”在线下测试的时候没有问题,但是线上后,由于线上的数据量较大,导致在执行查询的时系统崩溃:后来经过查找,发现写的sql不合理,查出了许多用不到的 ...

  5. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...

  6. Hello World -- 第一篇博客

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  7. YYHS-NOIP模拟赛-mine

    题解 这道题不难想到用dp来做 dp[i][0]表示第i个格子放0 dp[i][1]表示第i个格子放1且第i-1个格子放雷 dp[i][2]表示第i个格子放2 dp[i][3]表示第i个格子放1且第i ...

  8. 中秋H5,这篇脑洞开的可以!

    案例:嫦娥--寻开心出品:凯迪仕 1.内容:这是一支视频类H5案例.Loading完毕进入页面,首屏提示案例最佳观看方式为先锁屏再横屏.点击开始按钮播放视频,视频讲述"葫芦娃"缠着 ...

  9. d3力导向图聚焦

    效果描述 双击节点,节点以及节点一度关联的节点保持高亮状态,其余节点变灰,半径变小,文字消失,并且向内收缩. 效果展示 正常状态 聚焦效果 关键代码 节点变化 激活节点保持高亮的样式,其余节点应用no ...

  10. Java 内存模型- Java Memory Model

    多线程越来越多的使用,使得我们需要对它的深入理解.那么就涉及到了Java内存模型JMM.JMM是JVM的一部分,JMM定义了一个线程修改了一个共享变量,其他线程什么时候或者如何看到这个变量,如何去访问 ...