标题:java编程上机题,求各位大佬帮帮忙
只看楼主
muzi20181016
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-10-16
 问题点数:0 回复次数:5 
java编程上机题,求各位大佬帮帮忙
[b]很久很久以前,蜘蛛精和蝎子精俘虏了老爷爷和49名葫芦娃,蜘蛛精和蝎子精流着口水承诺不杀害任何葫芦娃,但是将他们关进一个有50间牢房的监狱里,每人一间牢房,牢房之间相互隔绝,无法输入或者输出任何信息。
监狱每天随机打开一间牢房的门,让老爷爷或者葫芦娃到院子里来放风。院子中间有一块一侧光滑一侧有花纹的圆形小石板,放风的人可以翻动石板,将石板的光滑面或者花纹面向上放置。除放风的人之外其他人都不会去碰石板。 除了石板以外,放风的人留下的任何其它痕迹都会在夜晚被清除干净(包括石板上作的任何记号)。牢房是完全封闭的,无法看到石板。
老爷爷为了能够获知蜘蛛精和蝎子精是否杀害了葫芦娃,和所有葫芦娃们商定了一个办法,这样老爷爷就能够知道所有被俘的葫芦娃是否还健在。请帮助设计老爷爷的方法,并编写程序计算老爷爷要知道所有人是否都健在可能需要多少天,请采样10次并给出平均值。



求帮忙!!!!!
搜索更多相关主题的帖子: java 编程 上机 是否 设计 
2018-10-16 16:38
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
这居然是上机题?看的眼睛疼

剑栈风樯各苦辛,别时冰雪到时春
2018-10-16 18:01
muzi20181016
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-10-16
得分:0 
回复 2楼 林月儿
对啊,上机题,求解答啊……
2018-10-17 00:36
悟空丨
Rank: 2
等 级:论坛游民
帖 子:18
专家分:50
注 册:2018-10-6
得分:0 
搬运知乎上的一个答案和思路  一起看看
思路:
作者:大胃王
链接:https://www.
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先就是前提条件,有50个牢房,其中一个是老爷爷,你也可以把他当成你自己,也就是主视角。其它的都是葫芦娃,他们会提前和你商量好对策,商量好对策之后你们就被关进牢房了,谁也见不到谁,但是他们会完全服从你们之前商量好的对策并按计划执行,你们之间的沟通工具只有那一块石板。然后是规则,每天随机打开一扇门(注意这里是随机,而不是依次),只有一个人能出来放风,并且可以选择翻动石板或者是啥也不干(因为其它的东西都会被清除,所以可以理解为啥也不干),翻动几次石板都可以,但石板只有两面,也就可以理解成true和false,你可以重新将石板赋值为true或false。最后根据上面所说的前提条件和规则,让老爷爷(也就是你自己)想出一个方法,计算出多少天之后可以确定其余49个葫芦娃都还活着(为什么是活着而不是死了后面会说)。由于是随机开门,所以这个天数不确定,所以需要模拟10次最后求出平均值。
问题说完了,然后说说我想到的解决办法:
首先将石板看作一个标志位,他只有两面,我们就将一面提前约定为true,另一面约定为false,并假定初始值为false。然后我们规定,而老爷爷放风的时候,如果是true,就改为false;如果是false,就啥也不干。葫芦娃们放风的时候,如果是false,就改为true;如果是true,就啥也不干;如果之前修改过标识位,则不管是true还是false,都啥也不干。这样每个葫芦娃修改标志位之后老爷爷都会知道,当修改次数达到49的时候,老爷爷就知道其余的葫芦娃都还活着了。这其中有两个关键的问题,一个就是因为开门的随机性,只能确定其余葫芦娃还活着,这种方法无法得知有葫芦娃死了,只能说有葫芦娃死亡的可能性;还有一个问题,就是石板最开始是光滑一面朝上还是花纹一面朝上必须确定,如果不确定,那老爷爷就可能会算出50个葫芦娃来。
程序代码:
import org.junit.Test;
import java.math.BigDecimal;
import java.util.*;

public class JavaTest {


    @Test
    public void test() {

        int count = 0;
        for (int i = 0; i < 10; i++) {
            List<Map<String, Object>> list = new ArrayList<>();
            for (int j = 0; j < 50; j++) {
                Map<String, Object> map = new HashMap<>();
                if (j == 0) {
                    map.put("count", 0);
                    map.put("name", "老爷爷");
                } else {
                    map.put("count", j);
                    map.put("flag", true);
                    map.put("name", "葫芦娃" + j);
                }
                list.add(map);
            }
            count += test1(list);
        }
        BigDecimal average = BigDecimal.valueOf(count).divide(BigDecimal.valueOf(10), 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("平均值是:" + average);

    }

    private int test1(List<Map<String, Object>> list) {
        int count = 1;
        boolean flag = false;
        int alive = 0;
        while (true) {
            // 去1-50之间的随机数
            Random random = new Random();
            int i = random.nextInt(50);
            Map<String, Object> person = list.get(i);
            Integer personCount = (Integer) person.get("count");
            if (personCount == 0) {
                // 老爷爷
                if (flag) {
                    flag = false;
                    alive++;
                }
            } else {
                // 葫芦娃
                if (!flag && (boolean) person.get("flag")) {
                    person.put("flag", false);
                    flag = true;
                }
            }
            if (alive == 49) {
                break;
            }

            count++;
        }
        System.out.println("第" + count + "天的时候,老爷爷知道了其余49个葫芦娃都还健在。");
        return count;
    }

}
2018-10-20 20:57
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
程序代码:
package com.huawei.day23;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class TestCase {
    static class Person {
        int id;
        boolean flag;
        public Person(int id, boolean flag) {
            this.id = id;
            this.flag = flag;
        }
    }
    public static void main(String[] args) {
        Map<Integer, Person> map = new HashMap<>();
        for(int i=0; i<50; i++) {
            map.put(i, new Person(i, true));
        }
        int avg = 0;
        for(int i=0; i<10; i++) {
            int alives = 0;
            int days = 0;
            map.values().forEach(e->e.flag=true);
            map.get(0).flag = false;
            while(alives < 49) {
                Random rand = new Random();
                int index = rand.nextInt(50);
                boolean flag = map.get(0).flag;
                if(index == 0 && flag) {// old man
                    alives++;
                    map.get(0).flag = false;
                } else if(index > 0 && !flag && map.get(index).flag) {// children
                    map.get(index).flag = false;// remove authority
                    map.get(0).flag = true;
                }
                days++;
            }
            System.out.format("days[%d]:%d\n", i, days);
            avg+=days;
        }
        System.out.format("avg:%d", avg/10);
    }
}

剑栈风樯各苦辛,别时冰雪到时春
2018-10-21 00:17
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
程序代码:
package com.huawei.day23;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TestCase2 {
    public static void main(String[] args) {
        List<Integer> chkedList = new ArrayList<>();
        int avg = 0;
        for(int i=0; i<10; i++) {
            int days = 0;
            int alives = 0;
            boolean flag = false;
            chkedList.clear();
            while(alives < 49) {
                Random rand = new Random();
                int index = rand.nextInt(50);
                if(index == 0 && flag) {// old man
                    alives++;
                    flag = false;
                } else if(index > 0 && !flag && !chkedList.contains(index)) {// children
                    chkedList.add(index);// remove authority
                    flag = true;
                }
                days++;
            }
            System.out.format("days[%d]:%d\n", i, days);
            avg += days;
        }
        System.out.format("avg:%d", avg/10);
    }
}

剑栈风樯各苦辛,别时冰雪到时春
2018-10-21 00:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490445-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.843873 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved