间接递归,三个传教士和三个野蛮人

问题描述

问题:编写一个用来解决“野蛮人和传教士”问题的递归程序。三个传教士和三个野蛮人渡河,只有一条可以同时搭载2人的小船。如果在河任一边的岸上野蛮人数比传教士人数多,野蛮人就会把传教士吃掉。该如何渡河?我用的方法是:go(intx1,inty1,intx2,inty2)back(intx1,inty1,intx2,inty2){{if(x1==0&&y1==0&&x2==3&&y2==3)back(x1-2,y1,x2+2,y2);go(x1+1,y1,x2-1,y2);back(x1,y1-2,x2,y2+2);go(x1,y1+1,x2,y2-1);back(x1-1,y1-1,x2+1,y2+1);go(x1+1,y1+1,x2-1,y2-1);}}下面是我的代码,请高手帮我优化一下,为了防止它无究递归下去,我限制了他求解的个数为1(加了一个flag)很容易陷入"一个野人和一个传教士过河,一个传教士和一个野人返回,一个野人和一个传教士过河,一个野人和一个传教士过河"这样死递归,最后StackOverException,问怎么消除这种情况呢?importjava.util.Iterator;importjava.util.LinkedList;importjava.util.Scanner;classTest{staticbooleanflag=false;staticLinkedList<String>list=newLinkedList<String>();staticvoidGo(intx1,inty1,intx2,inty2){if(x1<0||y1<0||x2<0||y2<0||x1>3||y1>3||x2>3||y2>3)return;if((x1>y1&&y1!=0)||(x2>y2&&y2!=0))return;if(flag)return;/*去掉这句就有问题了*/list.add("两个野人过河");Return(x1-2,y1,x2+2,y2);list.removeLast();list.add("两个传教士过河");Return(x1,y1-2,x2,y2+2);list.removeLast();list.add("一个野人和一个传教士过河");Return(x1-1,y1-1,x2+1,y2+1);list.removeLast();}staticvoidReturn(intx1,inty1,intx2,inty2){if(x1<0||y1<0||x2<0||y2<0||x1>3||y1>3||x2>3||y2>3)return;if((x1>y1&&y1!=0)||(x2>y2&&y2!=0))return;if(x1==0&&y1==0&&x2==3&&y2==3){flag=true;for(Iterator<String>i=list.iterator();i.hasNext();){System.out.println(i.next());}/*try{System.in.read();System.in.read();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}*/return;}list.add("一个野人返回");Go(x1+1,y1,x2-1,y2);list.removeLast();list.add("一个传教士返回");Go(x1,y1+1,x2,y2-1);list.removeLast();list.add("一个传教士和一个野人返回");Go(x1+1,y1+1,x2-1,y2-1);list.removeLast();}publicstaticvoidmain(String[]args){Go(3,3,0,0);}}

时间: 2024-10-28 07:33:55

间接递归,三个传教士和三个野蛮人的相关文章

如何用ASp实现去掉三个最高分和三个最低分

今天又帮助了一个网友,我的口号是"以帮助别人为快乐!" 问题:用asp如何实现去掉三个最高分和三个最低分?解决思路:1.将整个数组排序,删除两端的三个最大值和三个最小值(另一网友提出的!)2.挑选出其中三个最大的数和三个最小的数,将其删除!(我的思路!) 我觉得我的方法应该可行一些,因为要删除的数只有三个最大,三个最小,没有必要把所有的数都进行排序,特别是当数据很多时,将会浪费很多的资源!我写的序如下:<%@LANGUAGE="VBSCRIPT" CODEPA

怎样把网站从前三页做到前三位

正在做优化排名的朋友应该都知道,一个一般热度的词做到百度前三页问题应该不大,只是时间问题,但是做到百度前三位不仅仅是时间问题,还有技巧问题,很多人做了很久,一直遵循内容,外链,体验度的原则,但是始终没有做到百度前三位,这是为何呢,那么怎样才能把网站从前三页做到前三位呢,这不仅仅是对耐力的考验,更是对技巧应用和综合能力的考验. 第一,不要意味着盯着主关键词的排名 很多优化工作不是一蹴而就的,有的做了很多工作,效果都不太理想尤其是对热一些的关键词,如果你通过指数工具查询到某关键词的平均每天搜索量在1

web前端-一个div内含三个div,内部三个div向左浮动,最后一个自适应大小

问题描述 一个div内含三个div,内部三个div向左浮动,最后一个自适应大小 在页面body里有一main层div,里面有三块div:left,Middle,right;全部向左浮动,最左边两个left,Middle,固定宽度,让最后一个div自适应剩余的空间,理想图如图: 而我现实出现成这样,如图最右边的只有一小块,不知道怎么设置成充满,而且,由于屏幕的分辨率会变,最右边的还容易跑到最下边去,如图: 求各位大神指导.... 解决方案 最好写百分比......这样最起码不会出现小屏的时候,第三

Lucene.Net 2.3.1开发介绍 —— 三、索引(三)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果  索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是Field,接下来看看Field的各项设置都会有什么样的效果. 代码 3.1   Code 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index() 5{ 6    Analyzer analyzer = ne

展示一下不同时代的三个显示器的三屏输出

传统的多屏显示输出,一般应用于监控等领域,而随着技术的进步及用户需求增长,双屏甚至多屏显示已经走进了家庭,AMD Eyefinity的多联屏技术是多屏技术的低阶解决方案.该方案只需在全新一代APU2平台就可以完成,无需独立显卡,通过主板板载http://www.aliyun.com/zixun/aggregation/18245.html">视频输出接口即可实现多屏输出,更重要的是它还支持不同接口.不同分辨率显示器,您还别不信,小编这就为您展示一下不同时代的三个显示器的三屏输出,下面我们一

三大运营商未来三年内大幅削减补贴和广告支出

三大运营商未来三年内大幅削减补贴和广告支出,预计总额达400亿元. 业界关注的各大机场贵宾厅关闭有了明确的时间表.昨日,记者采访了省内三大运营商,广东联通人士表示,按照上级要求,省内机场贵宾厅于9月30日前关闭.广东移动和广东电信也表示将执行相关政策要求.业界预计,仅此一项可帮助三大运营商每年省下数亿元成本. 上百贵宾厅全关闭:每年省数亿元 广东电信是省内最早关闭贵宾厅的运营商.广东电信一位人士昨日表示,电信在全省共有5个相关贵宾厅,白云机场的2个贵宾厅已于本月1日和13日分别关闭,广州南站.深

对于软文写作的三个要和三个不要

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 继6月28号百度K站以来,百度一直都在不断的调整,而在这次K站百度也在解释中说到网站要有高质量的内容,而高质量的内容就是文章的原创性.相信大家都知道搜索引擎再怎么变动,对于原创文章依旧是很喜欢很友好的.而软文推广是我们在推广网站中必须要做的一件事情. 现在作为站长或是Seoer在我们推广网站时,为得到搜索引擎更好的排名,软文推广已经成为我们必

php与mysql三日通-第三天

mysql 一.基本函数 欢迎来到本教程的第三课,也是最后一课.如果您已经学过第一课和第二课,那么您已经掌握了MySQL和PHP的安装及编程的基本知识.下面我们要介绍PHP的一些其他函数,这些函数可能会对您有用,使您的开发过程更加简单.首先我们来看看头文件. 大家应该知道头文件的一些基本概念吧?头文件是一个外部文件,它的内容被包含到主程序中.方法也十分简单:在程序文件中引用头文件名,这个头文件就会包含进来了.在PHP中使用头文件,会涉及两个函数:include()和require().这两个函数

PHP/MySQL三日通-第三天

mysql 一.基本函数 欢迎来到本教程的第三课,也是最后一课.如果您已经学过第一课和第二课,那么您已经掌握了MySQL和PHP的安装及编程的基本知识.下面我们要介绍PHP的一些其他函数,这些函数可能会对您有用,使您的开发过程更加简单.首先我们来看看头文件. 大家应该知道头文件的一些基本概念吧?头文件是一个外部文件,它的内容被包含到主程序中.方法也十分简单:在程序文件中引用头文件名,这个头文件就会包含进来了.在PHP中使用头文件,会涉及两个函数:include()和require().这两个函数