「Java分鱼问题」Java分鱼问题

博主:adminadmin 2023-01-16 23:51:10 883

本篇文章给大家谈谈Java分鱼问题,以及Java分鱼问题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

JAVA编程的逻辑题,大神帮下!谢谢

方法一:

import java.util.ArrayList;

import java.util.List;

public class test10 {

// 解题思路:先带走猫,后带走狗,再把猫带回,把鱼带过去,最后再把猫带过去即可

// 定义两个集合,存放,带过去的动物,和剩下的动物

static ListString there = new ArrayListString();

static ListString here = new ArrayListString();

public static void main(String[] args) {

here.add("cat");

here.add("dog");

here.add("fish");

test10 test10 = new test10();

test10.take();

}

// 判断动物是否安全

public boolean isSafty(ListString list) {

// 如果一个集合中同时出现了猫和狗,猫和鱼的都认为不安全

if (list.add("dog") list.add("cat") || list.add("cat")

list.add("fish")) {

return false;

}

return true;

}

public void take() {

// 得到要带走的动物

String anim = here.get(0);

// 从剩下的集合中删除

here.remove(here.get(0));

if (anim.equals("cat")) {

// 添加到以带过去的集合里面

there.add(anim);

// 继续带下一个动物

if (here.isEmpty()) {

System.out.println();

System.out.println("最后在把" + anim + "带走了");

return;

} else {

System.out.println("带走了" + anim);

System.out.print("剩下:");

for (String s : here) {

System.out.print(s + " ");

}

System.out.println();

System.out.println("----------------------------");

take();

}

} else if (anim.equals("dog")) {

there.add(anim);

System.out.println("然后把" + anim + "带走");

// 判断是否安全,之后继续带下一个动物

if (isSafty(there)) {

take();

} else {

String animal = there.get(0);

there.remove(animal);

here.add(animal);

System.out.println("然后把" + animal + "带回");

// 继续带下一个动物

take();

}

} else if (anim.equals("fish")) {

System.out.print("之后把" + anim + "带走");

take();

}

}

}

方法二:

import java.util.ArrayList;

import java.util.Random;

/*

* 需求:

* 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。

* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。

* 编程解决猫狗鱼过河问题。

* 分析:

* 定义猫,狗,鱼元素.定义两岸集合.定义方法判断不和谐状况.

* 步骤:

* 1.将猫狗鱼抽象为三个String型变量.将两岸抽象为两个集合.

* 2.定义判断是否和谐方法.

* */

public class Test10 {

public static void main(String[] args) {

//开始过河.

doTransport();

}

public static void doTransport() {

// 抽象出猫,鱼,狗和两岸.

ArrayListString arr1 = new ArrayListString();

ArrayListString arr2 = new ArrayListString();

arr1.add("鱼");

arr1.add("猫");

arr1.add("狗");

// 农夫将要携带到船上动物.(前一字符表示农夫当前携带动物,后一字符表示上次农夫携带的动物,为了让农夫不出现重复拿同一个动物的情况)

System.out.println("农夫,猫,鱼,狗都在此岸,开始过河.\n");

String[] boat ={"-","-"};

while (arr1.size() 0) {

move(arr1, arr2, boat);

}

System.out.println("\n农夫,猫,鱼,狗都到达彼岸.");

}

public static void move(ArrayListString arr1, ArrayListString arr2,String[] boat) {

//农夫船上是否有动物,有则不需随机选择携带.

if (boat[0].equals("-")) {

int one=0;

do{

// 农夫从此岸随机带上一个动物.

one = new Random().nextInt(arr1.size());

}while(arr1.get(one).equals(boat[1]));

boat[1]=boat[0];

boat[0] = arr1.get(one);

arr1.remove(one);

}

// 判断此岸是否和谐

if (ifNice(arr1)) {

// 此岸和谐,农夫则将动物送去彼岸.

arr2.add(boat[0]);

System.out.println("---农夫带" + boat[0] + "去彼岸 ");

//首先判断是否将三个动物都放彼岸,是则无需判断是否和谐.

if(arr2.size()==3){

return;

}

// 判断彼岸是否和谐.

if (ifNice(arr2)) {

// 彼岸和谐,农夫则完成此次运送.

boat[1]=boat[0];

boat[0] ="-";

System.out.println(" 农夫单独回此岸---");

} else {

// 彼岸不和谐,农夫则将岸上动物与携带动物交换.送回此岸.

boat[0]=arr2.get(0);

System.out.println(" 农夫带" +boat[0]+ "回此岸---");

arr2.remove(0);

arr1.add(boat[0]);

boat[1]=boat[0];

boat[0]="-";

}

} else {

// 如果此岸不和谐则放回此岸.

arr1.add(boat[0]);

boat[1]=boat[0];

boat[0]="-";

}

}

public static boolean ifNice(ArrayListString arr) {// 判断是能否共存.

if ((arr.contains("猫") arr.contains("狗"))

|| (arr.contains("鱼") arr.contains("猫"))) {

return false;

} else {

return true;

}

}

}

C语言递归解决分鱼问题

#include stdio.h

#include stdlib.h

int fish(int n, int x);

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

int i=0, flag = 0, x;

do{

i=i+1;

x=i*5+1;

if(fish(5,x))//递归判断

{

flag = 1;

//flag标识

printf("五个人合伙捕到的鱼总数是%d\n", x);

}

}while(!flag);

return 0;

}

int fish(int n, int x)//x表示人数,x表示醒来后剩下的鱼

{

if(x%5==1)

{

if(n==1)

return 1;

else

return fish(n-1, (x-1)/5*4);

}

return 0;

}//这里递归的作用是作为判断条件

用C语言的递归解决分鱼问题

下面代码是我自己写的,看别人代码比较累,所以如果楼主愿意,可以看看下面的代码,我会尽量讲解细致一点。

#include stdio.h

//sub(manth,fishleft)参数意义:manth表示第几个人分鱼,fishleft表示他分鱼时获得了多少鱼

//函数的返回结果是第manth个人分鱼时剩余的条数,如manth = 5,fishleft = 1,则表示一共捕获了3906条鱼。

int sub(int manth,int fishleft){

if(manth == 1){

fishleft = (5*fishleft +1);

printf("manth = %d,fishleft = %d\n",manth,fishleft);

return fishleft;

}

fishleft = 5*sub(--manth,fishleft)+1;

printf("manth = %d,fishleft = %d\n",manth+1,fishleft);

return fishleft;

}

int main(void){

int manth = 5;

int fishleft = 1;

printf("%d\n",sub(5,1));

return 0;

}

//我得到的结果和楼主所给程序运行结果不一致!楼主可以自己计算,如果最后一个人得到的是1条鱼,则他分鱼时应该剩余6条,manth = 2时应该剩余6*5+1 = 31条,manth = 3时,应该剩余31*5+1条,最后manth= 5,也就是分鱼开始的时候,应该剩余3906条鱼。

//楼主可以用自己的程序测试,当调用sub(2)时得到的是21,而不是31,就能证明该程序应该是用问题的。

Java渔夫打渔问题

public class Fishman {

public static void main(String[] args) {

calcFish();

}

private static void calcFish() {

int total = 8;//至少有8条=邻居的海伦3条+又吃了一条 + 剩下4条

int left = 0;

do {

int sold = total / 2;//第一次卖掉一般剩下的

int firstLeft = sold - 3;//送掉邻居海伦剩下的

if(firstLeft % 3 == 0){

left = firstLeft/3 - 1;// 三分之一里面-吃掉的一条

if(left == 4 ){

System.out.println("total: " + total + " fish");

}

}

total += 2;//刚开始能平均2份,因此鱼数必定是偶数,步长为2

} while (left != 4);

}

}

一共36条

捕鱼的JAVA问题,大师们指导指导呗。。。

最少合伙捕到3906条鱼

A醒来发现鱼数是3906

B醒来发现鱼数是781

C醒来发现鱼数是156

D醒来发现鱼数是31

E醒来发现鱼数是6

/**

 * 计算捕鱼

 */

public class Fish {

    public String[] piscators = { "A", "B", "C", "D", "E"};

    public static void main(String[] args) {

        Fish fish = new Fish();

        for (int i = 0; i  10000; i++) {

            if (fish.averageFish(fish.piscators.length, i)) {

                fish.averageFish(i);

                break;

            }

        }

    }

    /**

     * 判断平均分鱼

     * @param piscatorSize 

     * @param fishNum

     * @return

     */

    public boolean averageFish(int piscatorSize, int fishNum) {

        boolean isAaverage = (fishNum - 1) % piscators.length == 0;

        //最后一个人也分成五分 所以piscatorSize  0 多分一次。

        if (isAaverage  piscatorSize  0) {

            return averageFish(piscatorSize - 1, (fishNum - 1) / piscators.length);

        }

        return isAaverage;

    }

    

    /**

     * 输出分鱼过程

     * @param fishNum

     */

    public void averageFish(int fishNum) {

        System.out.println("最少合伙捕到"+ fishNum + "条鱼");

        for (int i = 0; i  piscators.length; i++) {

            System.out.println(piscators[i] + "醒来发现鱼数是" + fishNum);

            fishNum = (fishNum - 1) / piscators.length;

        }

    }

}

Java分鱼问题的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java分鱼问题、Java分鱼问题的信息别忘了在本站进行查找喔。